#include<stdio.h>
int main()
{
int i=-3, j=2, k=0, m;
m = ++i || ++j && ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
return 0;
}
結果が-220 1になるのはなぜですか?
++ iがゼロ以外であるため、1つのロジックは(++ j && ++ k)は計算されません
ただし、&&の方が||よりも優先度が高いため なぜ計算されないのか
#include<stdio.h>
int main()
{
int i=-3, j=2, k=0, m;
m = ++i || ++j && ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
return 0;
}
結果が-220 1になるのはなぜですか?
++ iがゼロ以外であるため、1つのロジックは(++ j && ++ k)は計算されません
ただし、&&の方が||よりも優先度が高いため なぜ計算されないのか
優先順位は、式が評価される順序を指定しません。式の解釈方法を指定します。この場合、C の優先順位規則 (正式な文法に組み込まれている) によりa || b && c
、 が として解釈されa || (b && c)
ます。
この式が評価されるとき、C の規則は、a
最初に評価する必要があることを指定します。規則では、ifa
が true の場合、式全体の値が true であり、 の右側||
は評価されないとも述べています。
これをより明確に理解するために、次の式を考えてみましょうa + b < c * d
。優先順位規則により、これは として解釈され(a + b) < (c * d)
ます。ただし、 とは異なり||
、C の規則では、 の左側を<
最初に評価する必要があるとは指定されていません。よりも優先順位が高くても、コンパイラはa + b
最初または最初に評価する場合があります。コンパイラは、正しい答えを得る任意の評価順序を使用できます。c * d
*
+
ここで課せられる唯一の順序は、を評価する前にa + b
とc * d
の両方を評価する必要があるという<
ことです。ただし、それは優先順位のルールではなく、式の構造に由来します。
演算子&&
と||
計算の順序は左から右です。||
コンパイラは、左のオペランドが true と評価された場合、演算子の右のオペランドが計算されないことを保証します。
m = ++i || ++j && ++k;
++i
が最初に実行されます。以降、i
は になります。-2
これは と同等/意味しtrue
ます。++j && ++k
一部は実行されず、m
値は になります1
。
したがって、最終出力は次のようになります-2 2 0 1
を実行||
すると、左手の部分が最初に実行され、true
それから右に進みません。true
ですから、right-part が であるかであるかは関係ありませんfalse
。したがって、あなたの場合、||
実行された部分を残し、ゼロ以外の値を返すため、つまりtrue
.
短絡評価による
m = ++i || ++j && ++k;
と同等です
++i;
m = i != 0;
if(!m) {
++j;
m = j != 0;
if(m) {
++k;
m = k != 0;
}
}