2

ここでこのコードを理解するのに苦労しています。私の質問は、ポストインクリメントが変数 j で機能しないのはなぜですか? 行が実行されず、最終的に 0 1 ではなく 0 0 が出力されるように見えますか?

#include <stdio.h>

int main() {
    int i = 0, j = 0;
    (i == 0) || j++;
    printf("%d %d", i, j);
}

誰かが私が間違っている場所を説明してくれたらありがたいです、ありがとう!

4

2 に答える 2

10

論理 OR 演算子の 2 番目のオペランドは、最初のオペランド (部分式) が true の場合は評価されません。

この表現では

(i == 0) || j++;

i == 0は true であるため、2 番目のオペランドj++は評価されません。

のように式を書き換えると

(i == 0) && j++;

次に、2 番目のオペランド (部分式) が評価されます。

C 標準から (6.5.13 論理 AND 演算子)

4 ビットごとのバイナリ & 演算子とは異なり、&& 演算子は左から右への評価を保証します。2 番目のオペランドが評価される場合、1 番目と 2 番目のオペランドの評価の間にシーケンス ポイントがあります。最初のオペランドが 0 と等しい場合、2 番目のオペランドは評価されません。

and (6.5.14 論理 OR 演算子)

4 ビットごとの | とは異なります。演算子、|| 演算子は左から右への評価を保証します。2 番目のオペランドが評価される場合、1 番目と 2 番目のオペランドの評価の間にシーケンス ポイントがあります。最初のオペランドが 0 と等しくない場合、2 番目のオペランドは評価されません。

于 2019-11-27T14:41:59.717 に答える
2

(i == 0)と評価される1ので、の結果は||です1。この場合は実行しませんj++(i == 1) || j++;たとえば、そうでない場合は、j増加します。

これはここで説明されています:

lhs の評価後にシーケンス ポイントがあります。lhs の結果が 0 と等しくない場合、rhs はまったく評価されません (いわゆる短絡評価)。

于 2019-11-27T14:41:36.027 に答える