L'operatore sizeof
non valuta la sua tesi, solo looks at the type del suo operando.
Supponiamo di disporre di un array a
con tipo "array [N] di tipo T". Quindi, nella maggior parte dei casi, il tipo di nome a
è "puntatore a T" (T *
) e il valore del puntatore è l'indirizzo del primo elemento dell'array (&a[0]
). Cioè, il nome di un array "decade" da un puntatore al suo primo elemento. Il "decomposizione" non avviene nei seguenti casi:
- quando
a
viene utilizzato con l'operatore indirizzo-di (&
),
- nella inizializzazione
a
(è illegale assegnare agli array in C) e
- quando
a
è l'operando dell'operatore sizeof
.
Quindi, sizeof a
ti dà N
volte sizeof(T)
.
Quando si esegue sizeof(a-3)
, il tipo di operando su sizeof
è determinato dall'espressione a-3
. Poiché a
in viene utilizzato in un value context (vale a dire, nessuno dei tre contesti sopra), il suo tipo è "puntatore a int" e il nome a
decade in un puntatore a a[0]
. Pertanto, il calcolo di a-3
è un comportamento non definito, ma dal momento che sizeof
non valuta il suo argomento, a-3
viene utilizzato solo per determinare il tipo di operando, quindi il codice è OK (vedere il primo collegamento sopra per ulteriori informazioni).
Da quanto sopra, sizeof(a-3)
equivale a sizeof(int *)
, che è 4 sul computer.
La "conversione" è dovuta all'operatore di sottrazione. Potete vedere una simile, e forse più sorprendente, risultato con l'operatore virgola:
printf("%zu\n", sizeof(1, a));
stampa anche sizeof(int *)
, a causa del l'operatore virgola con conseguente a
abituarsi in un contesto di valore.
fonte
2010-02-05 15:23:29
Il secondo in realtà stampa 'sizeof (int *)', non 'sizeof (int)'. 'sizeof (int *)' capita anche di essere 4 sulla tua piattaforma. – AnT
Inoltre, il modo corretto di stampare un valore 'size_t' (il valore restituito da' sizeof') è con '"% zu "', supponendo che il compilatore supporti quella particolare caratteristica C99. In caso contrario, una scommessa migliore sarebbe quella di lanciarla su un 'unsigned' o' unsigned long'. –