2012-05-03 11 views
3

このCプログラムの出力は?次のCプログラムの出力

#include<stdio.h> 
int main(){ 
    int x,y,z; 
    x=y=z=1; 
    z = ++x || ++y && ++z; 
    printf("x=%d y=%d z=%d\n",x,y,z); 
    return 0; 
} 

与えられた出力は次のとおりです。 のx = 2、Y = 1、Z =
私はxの出力を理解しますが、インクリメントされませんどのようにy、zの値を参照することができない1。

答えて

12

これはshort-circuit evaluationの結果です。

表現++x2と評価され、コンパイラは2 || anythingは、常に関係なくanythingが何であるか(「真」)1と評価されていないことを知っています。したがって、anythingと評価されず、yzの値は変更されません。

あなたは

x=-1; 
y=z=1; 

にしようとするとあなたは、コンパイラは、式の結果を判断するためにORの右側を評価する必要があるためyz、インクリメントされていることがわかります。

編集: asaerlが最初にコメントのあなたのフォローアップの質問に答えたので、ちょうど彼の正解を少し拡大します。

演算子の優先順位は、式を構成する部分の結合方法を決定します。 ANDはORよりも優先順位が高いので、コンパイラがあなたの代わりに

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

これは、それが++x++y && ++z間のORを行うことを任務と葉の

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

を書いたことを知っています。この時点では、通常、標準に従って1つまたは他の式を最初に評価することを「好む」かどうかを自由に選択でき、通常は特定の順序に依存することはできません。この順序は演算子の優先順位とは関係ありません。しかし

、特に||&&のために評価が常には短絡が働くことができるように左から右へ進むと、開発者になることを、標準的な需要が評価の結果ならば評価されていない右辺式にを依存することができますlhsは伝えます。

+1

助けてくれてありがとうございましたが、ここで優先順位が決まっていませんか?意味は、++ y && ++ zは最初に評価され、|| ? – krishnang

+4

番号の優先順位は、評価の順序ではなく、解析の順序です。 ところで、 '++ z'が評価されたなら、それはUBでした。 ( 'z'を2回変更する) – asaelr

1

Cでは、0以外のものはすべて真とみなされ、||左から右に始まります。

したがって、コンパイラは最初の左オペランドをチェックし、真であれば他のオペランドをチェックしません。 ex。 A || B - この場合、Aが真の場合、コンパイラは真のみを返し、Bが真か偽かをチェックしません。しかし、Aが偽であればBをチェックし、それに応じて戻ります。つまり、Bが真、そしてBが偽ならば偽を返します。

プログラムコンパイラでは、最初に++ x(つまり2)がチェックされ、Cでは0以外のものがすべてtrueになります。したがって、他の式をチェック/インクリメントしません。

関連する問題