-7
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

4

2 に答える 2

4

優先度 ≠ 評価の順序。

と の短絡動作は、左辺が最初に評価されることを意味します||&&

  • の LHS が||true (非ゼロ) と評価される場合、RHS は評価されません (式はtrueRHS が何であれ)
  • の LHS が&&false (またはゼロ) と評価される場合、RHS は評価されません (式はfalseRHS が何であれ)

あなたの例では、評価され、-2 に等しく、これは非ゼロであるため、 (つまり、 )++iの右側は評価されず、インクリメントされません。||++j && ++kjk

于 2012-06-14T12:56:04.103 に答える
1

s は式の++前に実行されません。のみ++iが実行されます。これは、式の結果が 1 になることを示します。したがって、式の残りの部分は評価されません (短絡)。

あなたのコードは以下と同等です:

if (++i)
    m = 1;
else
    if (!++j)
        m = 0;
    else if (!++i)
        m = 0;
    else
        m = 1;

つまり、++iが true と評価されると、そのelse部分は決して実行されません。

于 2012-06-14T12:53:45.850 に答える