Comment les opérandes à l’intérieur (a + = 3, 5, a) vont-ils être dissortingbués ou calculés afin d’imprimer la valeur de «a»?

L’extrait de code est:

int main() { int a = 1, b = 2, c = 3; printf("%d", a += (a += 3, 5, a)); } 

Bien qu’il affiche 8 dans le terminal en tant que sortie. Mais je ne comprends pas le concept derrière.

Ceci est un effet du fonctionnement de l’opérateur de virgule, le dernier élément est celui qui est utilisé comme valeur de l’instruction. Donc essentiellement ce que vous avez ici est le suivant:

 a += (a += 3, 5, a) 

Cela évalue a+=3 premier, cela donne a=4 ce résultat est ignoré, puis évalue 5 puis ce résultat est ignoré, puis évalue a et conserve ce résultat car il s’agit du dernier élément. Le résultat de (a += 3, 5, a) est le dernier élément qui est un qui est 4.

Alors vous obtenez

 a += 4 

donc a est 8 .

Remarque importante : il s’agit d’un artefact de la façon dont votre compilateur a généré le code. La norme C ne garantit pas l’ordre d’exécution de l’affectation dans cette situation. Voir haccks answer pour plus d’informations à ce sujet.

L’expression a += (a += 3, 5, a) invoquera un comportement indéfini.

C standard dit

C11: 6.5.16 Opérateurs d’affectation (p3):

[…] L’effet secondaire de la mise à jour de la valeur stockée de l’opérande gauche est séquencé après les calculs de valeur des opérandes gauche et droit. Les évaluations des opérandes ne sont pas séquencées .

Il n’est pas garanti que le plus a gauche soit évalué avant ou après l’évaluation de (a += 3, 5, a) . Cela entraînera un comportement indéfini.