[英]C Operator Precedence, post-increment programming issue
有人可以解釋為什么程序的輸出是
0 1 1 3 1
void main(void)
{
int i=-1,j=0,k=1,l=2,m;
m=i++&&j++&&k++||l++;
printf("%d %d %d %d %d",i,j,k,l,m);
}
主要關注的是“為什么k不增加”。
FYI ..我正在用VC ++編輯器Windows 7 32位編譯程序。 提前謝謝了。
大致:
為了評估i++&&j++
,編譯器首先評估了i
。 結果是-1
。 -1
存儲在臨時變量中。 然后i
增加了。
因為-1
不為零,編譯器評估j
,即0
。 編譯器現在評估-1 && 0
,即0
。 然后j
增加了。
此時, i = 0
且j = 1
。 剩余表達式: m=0&&k++||l++;
為了評估0&&k++
,編譯器注意到第一個操作數為0
。 結果必須為0
因此編譯器不評估k
或k++
。 剩余表達式: m=0||l++;
我希望你能完成剩下的工作。 :)
讓我們將其分解為單獨的操作:
i++ && j++
:這與-1 && 0
相同,為假(即0)。 i
和j
分別增加到0
和1
。 0 && k++
:零來自前一個邏輯運算,結果為假,因為第一個運算符為false。 k
不會增加。 0 || l
0 || l
:零仍然來自前一個邏輯運算,它是0 || 2
0 || 2
結果將是真實的,即1
。 l
增加到3
。 m
,現在變為真(即1
) 整個表達式導致i
, j
和l
增加, m
變為1
。 只是你看到的結果。
你的價值計算如下
m=((((i++)&&j++)&&k++)||l++);
因為所有的++都是后遞增的,所以在計算m時,所有變量都具有相同的值,但是在打印期間它們都會遞增。最后是|| 所以最終的TRUE將返回m的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.