int i=-3, j=2, k=0, m;
m = ++i || ++j && ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
由於++
具有多個優先級比用C ||
和&&
,它們首先被評估,因此,表達式變爲m = -2 || 3 && 1
。現在,您可以應用短路,但會產生不正確的答案。這是爲什麼?Precendence VS短路用C
int i=-3, j=2, k=0, m;
m = ++i || ++j && ++k;
printf("%d, %d, %d, %d\n", i, j, k, m);
由於++
具有多個優先級比用C ||
和&&
,它們首先被評估,因此,表達式變爲m = -2 || 3 && 1
。現在,您可以應用短路,但會產生不正確的答案。這是爲什麼?Precendence VS短路用C
++
s在表達式之前不執行。只有++i
執行,這表明表達式的結果將爲1,因此表達式的其餘部分不會被評估(短路)。
您的代碼就相當於:
if (++i)
m = 1;
else
if (!++j)
m = 0;
else if (!++i)
m = 0;
else
m = 1;
這意味着,一旦++i
被評估爲true,則永遠不會執行else
部分。
Precedence ≠ order of evaluation.
的||
和&&
的短路行爲意味着它們的左手側被首先計算,並且
||
的LHS評估爲真(非零)時,RHS (因爲不管什麼RHS,表達式將是true
)&&
的LHS評估爲假(或零),則不評估RHS(因爲exp ression將false
不管RHS是什麼)在你的榜樣,++i
得到評估,並等於-2,這是零,所以||
的右手邊(即++j && ++k
)永遠不會被評估:j
和k
永遠不會增加。
如果我們有'!(++ i || ++ j && ++ k)'而不是'j'和'k'是否增加? – Pacerier
omg roflmoa wut iz the prblm herr ?? –
這就像我眼中的派對,只有邪惡的小丑被邀請。 –
你得到的輸出是什麼,你期望的輸出是什麼? – Jay