簡體   English   中英

C運算符優先級,增量后編程問題

[英]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 = 0j = 1 剩余表達式: m=0&&k++||l++;

為了評估0&&k++ ,編譯器注意到第一個操作數為0 結果必須為0因此編譯器不評估kk++ 剩余表達式: m=0||l++;

我希望你能完成剩下的工作。 :)

讓我們將其分解為單獨的操作:

  1. i++ && j++ :這與-1 && 0相同,為假(即0)。
  2. 然后ij分別增加到01
  3. 0 && k++ :零來自前一個邏輯運算,結果為假,因為第一個運算符為false。
  4. 由於邏輯運算符的快捷性, k 不會增加。
  5. 0 || l 0 || l :零仍然來自前一個邏輯運算,它是0 || 2 0 || 2結果將是真實的,即1
  6. l增加到3
  7. 邏輯運算的結果被賦給m ,現在變為真(即1

整個表達式導致ijl增加, m變為1 只是你看到的結果。

你的價值計算如下

m=((((i++)&&j++)&&k++)||l++); 

因為所有的++都是后遞增的,所以在計算m時,所有變量都具有相同的值,但是在打印期間它們都會遞增。最后是|| 所以最終的TRUE將返回m的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM