2012-02-22 17 views
5

私はCの基本を取り上げていましたが、以下の問題を解決しようとしていたのですが、なぜ変数cの出力が異なるのか説明できますか?出力でcがインクリメントされないのはなぜですか?

次のプログラムの出力はどのようなものですか?

int main() 
{ 
    int a = -3, b = 2, c= 0, d; 
    d = ++a && ++b || ++c; 
    printf ("a = %d, b = %d, c = %d, d = %d", a, b, c, d); 
} 

回答:-2、3、0、1

cは出力にインクリメントされないのはなぜ?

+1

D =((-2 && 3)||(C++))。それはcになる前に短絡しています。 –

+0

実際に何をしようとしていますか?それとも単にコードで遊んでいるだけですか? – Bart

+0

単純にCのパズルを解く – Nisha

答えて

10

||のRHS(右側)が実行されないため、LHSはfalseと評価され、LHSはtrueと評価されないため、変数cはインクリメントされません。 C ||および&&演算子は「短絡」演算子です。第1オペランドが表現の全体的な真理を決定するには不十分でない限り、第2オペランドを評価しません。

&&||より緊密に結合する、ように動作を括弧ことができる:++aの値が0ではない任意の値に評価されるので(真と評価され、-2

d = (++a && ++b) || ++c; 

true); ++bの値は3で、これは真と評価されます。したがって&&という用語の値は真です。 true || falsetrue || trueは両方ともtrueと評価されるため、全体的な結果を知るためにRHSを評価する必要はありません。 (&&の類似ルールは、第1項が偽と評価された場合、全体の式が偽でなければならないため、第2項を評価する必要はないということです。は++aゼロまたは偽であるため、&&のRHSは評価されません。||のLHSがFALSEとなるため、cが増分され、全体的な結果を決定するためにRHSを評価する必要があります)。

+2

多分、彼は-2と3がどのように真であるかを理解していません。 –

+0

@ 0A0D:私はそれに注目しました - あなたは正しいかもしれません。 –

9

++a && ++btrueと評価されています。

これをショートサーキットといいます。条件内の式は左から右に評価されます。あなたのケースでは、句の最初の条件がtrueと評価された場合、式全体がすでにtrueであることが分かっているため、2番目の条件も評価される必要はありません。

2

ブール論理演算子&&||short-circuitingです。これは、左側を評価するだけで答えを知るには不十分である場合、彼らは右側を評価することを意味します。

コードの場合、左辺がゼロではないため、ブール値または真の結果が真となり、さらに処理する必要がないため、++cを評価しないという効果があります。

2

これは、レイジーブール式の評価です。 実行は次のとおりです。

++a-2

++b3

-2 && 31

オーケーを与える与え与えます! ||の結果を確認する必要はありません。したがって++cは評価されません。

ルールは次のとおりです。表現部分Xは、ケースでは評価されません。(0 && X)(1 || X)。ここでは1はもちろん「0ではない」。

それはシーンの背後にどのように機能するかを大まかにだ
2
 
d= ++a && ++b || ++c 
d= ++(-2) && ++b || ++c 
d= -1 && ++b || ++c 
d= true && ++b || ++c 
d= true && ++2 || ++c 
d= true && true || ++c 
d= true || ++c 
d= 1 

...

関連する問題