Note
Cette réponse a été fusionnée à partir d'un doublon, ce qui explique la date tardive.
Original
À l'exception de tableaux de longueur variable taille de n'évalue pas ses arguments. C'est ce que montre la section du projet de norme C99 6.5.3.4
La taille de l'opérateur paragraphe 2 qui dit :
L'opérateur sizeof donne la taille (en octets) de son o ou le nom parenthésé d'un type. La taille est déterminée à partir du type de l'opérande. Le résultat est un entier. Si le type de l'opérande est un type de tableau à longueur variable l'opérande est évalué ; sinon, l'opérande n'est pas évalué et le résultat est une constante entière. constante entière.
Un commentaire( maintenant supprimée ) a demandé si une telle chose pouvait être évaluée au moment de l'exécution :
sizeof( char[x++] ) ;
et c'est effectivement le cas, quelque chose comme ceci fonctionnerait également ( Voir les deux en direct ):
sizeof( char[func()] ) ;
puisqu'il s'agit dans les deux cas de tableaux de longueur variable. Cependant, je ne vois pas d'utilité pratique à l'un ou à l'autre.
Remarque : les tableaux de longueur variable sont traités dans la section projet de norme C99 section 6.7.5.2
Déclarateurs de tableaux paragraphe 4 :
[...] Si la taille est une expression constante entière et que le type d'élément a une taille constante connue, le type de tableau n'est pas un type de tableau à longueur variable ; sinon, le type de tableau est un type de tableau à longueur variable.
Mise à jour
En C11, la réponse change pour le cas VLA, dans certains cas, il n'est pas précisé si l'expression de la taille est évaluée ou non. De la section 6.7.6.2
Déclarateurs de tableaux qui dit :
[...] Lorsqu'une expression de taille fait partie de l'opérande d'une expression de taille de et que la modification de la valeur de l'expression de taille ne serait pas pas le résultat de l'opérateur, il n'est pas précisé si l'expression de l'expression de taille est évaluée ou non.
Par exemple, dans un cas comme celui-ci ( voir en direct ):
sizeof( int (*)[x++] )
41 votes
Je note que DevC++ utilise un très vieux compilateur obsolète, vous voudrez peut-être passer à un IDE plus récent, par exemple Codeblocks Eclipse ou Visual Studio.
0 votes
Une note pour moi-même : stackoverflow.com/a/21995718 est la bonne réponse.
0 votes
printf("%d and ", sizeof(x++)); // note 1
cause UB, pourquoi s'attendre à des résultats significatifs ? Veuillez lire leprintf()
ou les sections de la norme C concernant lesprintf()
/fprintf()
.