int i=-3, j=2, k=0, m;
m = ++i || ++j && ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
C ではand++
よりも優先順位が高いため、それらが最初に評価されるため、式は になります。これで短絡を適用できますが、それは間違った答えを生み出します。何故ですか?||
&&
m = -2 || 3 && 1
と の短絡動作は、左辺が最初に評価されることを意味します||
。&&
||
true (非ゼロ) と評価される場合、RHS は評価されません (式はtrue
RHS が何であれ)&&
false (またはゼロ) と評価される場合、RHS は評価されません (式はfalse
RHS が何であれ)あなたの例では、評価され、-2 に等しく、これは非ゼロであるため、 (つまり、 )++i
の右側は評価されず、インクリメントされません。||
++j && ++k
j
k
s は式の++
前に実行されません。のみ++i
が実行されます。これは、式の結果が 1 になることを示します。したがって、式の残りの部分は評価されません (短絡)。
あなたのコードは以下と同等です:
if (++i)
m = 1;
else
if (!++j)
m = 0;
else if (!++i)
m = 0;
else
m = 1;
つまり、++i
が true と評価されると、そのelse
部分は決して実行されません。