#include<stdio.h>
void main()
{
int a=1;
int c;
c=(a*=2)+(a+=3);
printf("c=%d",c);
getch();
}
c變數的輸出值是多少?為什麼會是16?
操作符就是將給定的數字做一些處理,然後返回一個數字。而操作符的計算也就是執行操作符的處理,並傳回值。前面已經知道,操作符是個符號,其一側或兩側都可以接數字,也就是再接其他動作符,而又由於賦值操作符也屬於一種操作符,因此操作符的執行順序變得相當重要。
對於a + b + c,將先執行a + b,再執行( a + b ) + c的操作。你可能覺得沒什麼,那麼如下,假設a之前為1:
c = ( a *= 2 ) + ( a += 3 );
上句執行後a為5。而c = ( a += 3 ) + ( a *= 2 );執行後,a就是8了。那麼c呢?結果可能會大大的出乎你的意料。前者的c為10,而後者的c為16。
上面其實是一個障眼法,其中的“+”沒有任何意義,即之所以會從左向右執行並不是因為“+”的緣故,而是因為( a *= 2 )和( a += 3 )的優先順序相同,而按照“()”的計算順序,是從左向右來計算的。但為什麼c的值不是預想的2 + 5和4 + 8呢?因為賦值操作符的傳回值的關係。
賦值操作符返回的數字不是變數的值,而是變數對應的地址。這很重要。前面說過,光寫一個變數名就會返回相應變數的值,那是因為變數是一個映射,變數名就等同於一個地址。C++中將數字看作一個很特殊的操作符,即任何一個數字都是一個操作符。而地址就和長整型、單精確度浮點數這類一樣,是數位一種類型。當一個數字是地址類型時,作為操作符,其沒有要操作的數字,僅僅返回將此數字看作地址而標識的記憶體中的內容(用這個地址的類型來解釋)。地址可以通過多種途徑得到,如上面光寫一個變數名就可以得到其對應的地址,而得到的地址的類型也就是相應的變數的類型。如果這句話不能理解,在看過下面的類型轉換一節後應該就能瞭解了。
所以前面的c = ( a += 3 ) + ( a *= 2 );,由於“()”的參與改變了優先順序而先執行了兩個賦值操作符,然後兩個賦值操作符都返回a的地址,然後計算“+”的值,分別計算兩邊的數字——a的地址(a的地址也是一個操作符),也就是已經執行過兩次賦值操作的a的值,得8,故最後的c為16
閱讀全文
類別:預設分類 查看評論