關於c語言中自增自減運算符的一點思考

昨天在羣裏面聊天,一同學問的問題:

以下程序:

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

}

要想進一步學習這些,需要涉及到彙編,而不同的編譯器可能具體機制不同,所以可能會產生不同結果。

最後,在實際編程中,我們要儘量避免此類現象,應該平時注意寫規範、可讀性好的代碼。                                                       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章