4 votes

Utiliser la virgule dans une expression et l'assigner à une variable

Veuillez expliquer ce bloc de code :

void main()
{   
    int t,
        a = 5,
        b = 10,
        c = 15;  
    t = (++a && ++b, ++a), ++a || ++c;   // need explanation for this line
    printf("%d  %d  %d %d", t, a, b, c);
}

8voto

Carl Norum Points 114072

L'opérateur virgule renvoie le résultat de son second opérande, et l'opérateur || l'opérateur court-circuite. Donc ce qui se passe dans ce cas est :

  1. ++a est évaluée, a est maintenant 6 .

  2. Puisque le résultat de (1) était non nul, le côté droit de l'équation && est évaluée. Cela signifie que ++b donc b devient 11 .

  3. (1) et (2) sont le côté gauche d'un opérateur virgule, donc le résultat de l'opérateur && est rejetée. (c'est 1 si cela vous importe).

  4. Le site ++a sur le côté droit de la première , est évaluée. a est maintenant 7 .

  5. l'affectation à t a lieu - t est maintenant 7 le résultat du premier opérateur à virgule.

  6. Tout cela était le côté gauche d'un autre opérateur de virgule, donc le résultat ( 7 ) est écarté. Suivant ++a est évaluée. a est maintenant 8 .

  7. Desde a est différent de 0, le || les courts-circuits, et les ++c n'est pas évalué. c reste 15 .

Résultats : t es 7 , a es 8 , b es 11 y c es 15 . Le site printf les sorties du relevé :

7  8  11 15

Globalement, ce code serait plus facile à comprendre si vous écriviez simplement :

++a;
++b;
t = ++a;
++a;

Qui a précisément le même comportement.

6voto

Navnath Points 1821

Exécution ->

  t = (++a && ++b, ++a), ++a || ++c;  // () Priority
      ^
  t = (++a && ++b, ++a), ++a || ++c;  // ++a -> a = 6
        ^
  t = ( 6 && ++b, ++a), ++a || ++c;   // ++b -> b = 11
               ^
  t = ( 6 && 11 , ++a), ++a || ++c;   // 6 && 11 -> 1
           ^          
  t = ( 1 , ++a), ++a || ++c;         // ++a -> a = 7
            ^          
  t = ( 1 , 7), ++a || ++c;          // (1,7) -> 7 ... Comma operator has less priority 
          ^          
  t = 7, ++a || ++c;                //  (t = 7), ++a || ++c; ...Assigned value to t... Comma operator has less priority 
    ^
  ++a || ++c;                       // ++a -> a = 8
   ^          
  8 || ++c;                        //  8 || ++c -> 1 ...as 1 || exp -> 1...Logical OR skip next part if 1st exp is true  
    ^

Enfin ->

t = 7
a = 8
b = 11
c = 15

0voto

suspectus Points 5877
int t, a = 5, b = 10, c = 15;

En C (et C++), l'opérateur virgule évalue son premier opérande, le rejette, évalue son second opérande et le renvoie.

++a && ++b est d'abord évalué, a est maintenant 6, b est maintenant 11.

(++a && ++b, ++a) maintenant le deuxième opérande à droite de la virgule ( ++a ) est évalué, a est maintenant 7. De même, à ce stade, t est affecté à la valeur 7. En effet, l'opérateur d'assignation a une plus grande priorité que l'opérateur de virgule. .

(++a && ++b, ++a), ++a now the second operand to the right of (++a && ++b, ++a) is evaluated. The third ++a` donne la valeur de a comme 8.

La logique || L'opérateur évalue son premier opérande et s'il s'agit de true il n'évalue pas le second opérande. Le premier opérande (++a && ++b, ++a), ++a est non nul (vrai) et donc le ++c n'est pas évalué. La valeur de c reste à 15.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X