ここでこのコードを理解するのに苦労しています。私の質問は、ポストインクリメントが変数 j で機能しないのはなぜですか? 行が実行されず、最終的に 0 1 ではなく 0 0 が出力されるように見えますか?
#include <stdio.h>
int main() {
int i = 0, j = 0;
(i == 0) || j++;
printf("%d %d", i, j);
}
誰かが私が間違っている場所を説明してくれたらありがたいです、ありがとう!
ここでこのコードを理解するのに苦労しています。私の質問は、ポストインクリメントが変数 j で機能しないのはなぜですか? 行が実行されず、最終的に 0 1 ではなく 0 0 が出力されるように見えますか?
#include <stdio.h>
int main() {
int i = 0, j = 0;
(i == 0) || j++;
printf("%d %d", i, j);
}
誰かが私が間違っている場所を説明してくれたらありがたいです、ありがとう!
論理 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 番目のオペランドは評価されません。
(i == 0)
と評価される1
ので、の結果は||
です1
。この場合は実行しませんj++
。(i == 1) || j++;
たとえば、そうでない場合は、j
増加します。
これはここで説明されています:
lhs の評価後にシーケンス ポイントがあります。lhs の結果が 0 と等しくない場合、rhs はまったく評価されません (いわゆる短絡評価)。