昨天在羣裏面聊天,一同學問的問題:
以下程序:
#include<stdio.h>
int main()
{
int i=0, j=0;
printf("%d ,%d ,%d\n ",i,i++,i++);
printf("%d ,%d ,%d \n",j,++j,++j);
//
return 0;
}
可能很多人能很快的得出答案,這不挺簡單的題目嗎?
然而自己一運行(假設編譯器爲vc++ 6.0),運行結果應該是:0 0 0
2 2 1
怎麼回事?
其實這就需要追究兩點:1.自增自減運算符 2.printf()機制
首先,在VC++編譯器中,printf(“ %d%d”,a,b)是從右向左處理函數的參數。 即先將b壓入棧中,再將a壓入棧中。 最後,從棧中依次讀取a,b.
其次,自增自減運算符,先增運算符是在語句執行前操作,而後增運算符如a++是在語句執行後操作。
所以,語句 printf("%d ,%d ,%d\n ",i,i++,i++);在執行時,按printf棧機制和處理參數順序理解。執行輸出後,進行i++操作兩次。
語句printf("%d ,%d ,%d \n",j,++j,++j); 先將第2個++j壓入棧(此時j=1),再將第1個++j壓入棧(此時j=2),再將第一個j壓入棧(此時,j=2)。最後依次讀取(221)。
可見這涉及到編程語法和編譯器如何處理。
如下:
#include<stdio.h>
int main()
{
int i=0, j=0;
printf("%d ,%d ,%d\n ",i,i++,i++);
printf("此時i=%d\n ",i); // i=2
printf("%d ,%d ,%d \n",j,++j,++j);
printf("此時j=%d\n",j); //j = 2
//
return 0;
}
要想進一步學習這些,需要涉及到彙編,而不同的編譯器可能具體機制不同,所以可能會產生不同結果。
最後,在實際編程中,我們要儘量避免此類現象,應該平時注意寫規範、可讀性好的代碼。