今天同事問我一個表達式運算問題:
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~