2017-08-10 12 views
0

以下のコードで、私は「はい」と回答しています。しかし答えはノーです。これは、私が& &の操作の後で増分していることを意味します。 if()が評価されると、式全体が一度インクリメントされることを期待していました。ポストインクリメントに関連するルールは何ですか?それはあなたが「いいえ」を持っていることを論理的ですので、それは左から右にコンパイルifステートメントの式内のポストインクリメント

int main() 
{ 
    int i = 1; 
    if (i++ && (i == 1)) 
     printf("Yes\n"); 
    else 
     printf("No\n"); 
} 
+6

'&&'の場合、左側が完全に評価され、 'i'がインクリメントされます。あなたが尋ねるはずの '++'ではなく、 '&&'です。 – Cornstalks

+0

これは、すべての論理演算子のケースか、それともほんの少数ですか? – Rajesh

+3

[短絡動作]のために、 '&&'と '||'の場合があります(https://stackoverflow.com/questions/628526/is-short-circuiting-logical-operators-mandated-and-評価オーダー)。これらの演算子の両方は、常に左側の引数を完全に評価します。その評価の結果に応じて、右の議論を継続し、評価するかもしれません(あるいはそうでないかもしれません)。 – Cornstalks

答えて

0

は、ダウンまで、あなたのif文は、私が2に等しくなるように原因となるi++が含まれており、その後trueを返します。私はもはや1に等しいので、i==1を返します。これはを返します。したがって、ifステートメントはfalseを返して、elseにあるものを実行するようになります。

論理演算子についての簡単な説明:

& &は:左から右に評価され、それが本当であることができますので、すべて評価された条件は「真」を返す必要があります。

||:1つの真の条件を見つけたら、評価が真で終了することを除いて、左から右に評価されます。

3

論理AND演算子&&左オペランドの評価と右オペランドの間シーケンスポイントを有しています。つまり、左のオペランドが最初に評価され、副作用(この場合は増分)が評価されます。

この式では、iは値1で始まります。したがって、式i++は1の値を持ち、値iがインクリメントされます。

&&オペレータの左側にあるため、この値はtrueと評価されるため、右側が評価されます。値が0(偽)の場合、右側は評価されません。

この時点では、iの値は2であるため、i == 1はfalseと評価され、&&演算子の結果はfalseになります。これにより、else句が実行されます。

関連する問題