2011-09-09 2 views
3

Duplicate possible:
why "++x || ++y && ++z" calculate "++x" firstly ? however,Operator "&&" is higher than "||"priorité de l'opérateur en C

Le programme suivant ne semble pas fonctionner comme prévu. '& &' doit avoir une précence supérieure à '||', donc la sortie réelle est confuse. Quelqu'un peut-il expliquer l'o/p s'il vous plaît?

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int x; 
    int y; 
    int z; 

    x = y = z = 1; 

    x++ || ++y && z++; 

    printf("%d %d %d\n", x, y, z); 

    return 0; 
} 

La sortie réelle est la suivante: 2 1 1

TIA.

+0

Un autre http://stackoverflow.com/questions/7212482/problem-with-operator-precedence – AnT

Répondre

5

La préséance et l'ordre d'évaluation sont aucune relation.

&& ayant une priorité plus élevée que || signifie simplement que l'expression est interprétée comme

x++ || (++y && z++); 

Ainsi, l'opérande gauche de || est évaluée en premier (nécessaire car il y a un point de séquence après) et puisqu'il évalue non nul, l'opérande droit (++y && z++) n'est jamais évalué.

1

Les règles de priorité des opérateurs signifie l'expression est traitée comme si elle était écrite:

x++ || (++y && z++); 

Depuis x++ est vrai, l'ERS de l'expression || est pas évalué tout - donc le résultat que vous voyez.

2

La ligne confusion est analysée comme si elle était:

x++ || (++y && z++); 

alors ceci est évalué à gauche à droite. Puisque || est un évaluateur de court-circuit, une fois qu'il évalue le côté gauche, il sait que l'expression entière évaluera à une vraie valeur, ainsi elle s'arrête. Ainsi, x est incrémenté et y et z ne sont pas touchés.