關於C中自加/減的問題溫習,自己mark一下

今天同事問我一個表達式運算問題:

dest = (source)|(++source)|(++source);

原表達式遠比這複雜,但問題最終可以簡化成此式。

她原意是:

dest = source;

dest |= ++source;

dest |= ++source;

結果當然是不對了,但我也說不上爲什麼不對,但可以肯定是出在++source上,

於是我寫了個程序測試: 

 x=1;
 y = (++x)+(++x)+(++x);
 printf("%d \n",y);    //結果10
 x=1;
 y = x+(++x)+(++x);
 printf("%d \n",y);    //結果7
 x=1;
 y = (++x)+(++x)+x;
 printf("%d \n",y);    //結果9
 x=1;
 y = 1+(++x)+(++x);
 printf("%d \n",y);    //結果7
 x=1;
 y = (++++x)+(++x);
 printf("%d \n",y);    //結果8

雖然每個編譯器對++/--的處理不盡相同,但就VC來說,雙目運算符的兩個運算量的值會先於後續運算而確定,因此第一個結果是10(3+3+4)。在編譯自加/減時,編譯器會首先運算從左至右第一個運算符,因此會先計算前兩個括號內的++。

對於第2個結果是(2+2+3)是因爲VC在計算表達式時會從左向右計算,因此在算x+(++x)+(++x)時,會先計算x+(++x)即(2+2),然後再帶入原表達式即(2+2+3),對於1的結果,其也是因爲此。

時間太久,已經忘記++/--的運算特點了,在此mark一下,O(∩_∩)O~

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