Il seguente programma stampa lo stesso numero due volte il gcc 4.8.2:Le parentesi fanno la differenza quando si determina la dimensione di un array?
#include <stdio.h>
int main()
{
char a[13];
printf("sizeof a is %zu\n", sizeof a);
printf("sizeof(a) is %zu\n", sizeof(a));
}
Secondo this reddit post, gcc non è conforme agli standard in questo senso, perché un'espressione tra parentesi non è sulla lista delle eccezioni per quando decadimento da matrice a puntatore non accade.
Questo ragazzo è corretto? Ecco la citazione norma pertinente:
Tranne quando è l'operando dell'operatore
sizeof
o unario&
dell'operatore, o è una stringa di caratteri letterali utilizzate per inizializzare una matrice di tipo di carattere, o è una vasta stringa letterale utilizzato per inizializzare un array con tipo di elemento compatibile conwchar_t
, un lvalue che ha tipo 'array di tipo' viene convertito in un'espressione che ha tipo 'puntatore a tipo' che punta al membro iniziale dell'oggetto array e non è un lvalue .
Giusto per essere chiari, egli sostiene che (a)
dovrebbe innescare decadimento gamma-to-pointer, perché parentesi non sono coperti nella lista di cui sopra (sizeof
operatore, unario &
operatore, stringa letterale come inizializzatore).
No, quel ragazzo è seriamente confuso –
Con le sue stesse parole, sarei d'accordo con * confusamente terminato * – chqrlie
Non ho trattato questa roba per circa 15 anni, ma sto sicuramente ricordando uno scenario con, penso , 'sizeof' dove la presenza o l'assenza di parentesi era significativa - determinato se si stesse prendendo la dimensione del puntatore o la dimensione dell'elemento o qualcosa del genere. –