#include<stdio.h>
void main()
{
int a=1;
int c;
c=(a*=2)+(a+=3);
printf("c=%d",c);
getch();
}
c變量的輸出值是多少?為什么會(huì)是16?
操作符就是將給定的數(shù)字做一些處理,然后返回一個(gè)數(shù)字。而操作符的計(jì)算也就是執(zhí)行操作符的處理,并返回值。前面已經(jīng)知道,操作符是個(gè)符號(hào),其一側(cè)或兩側(cè)都可以接數(shù)字,也就是再接其他操作符,而又由于賦值操作符也屬于一種操作符,因此操作符的執(zhí)行順序變得相當(dāng)重要。
對(duì)于a + b + c,將先執(zhí)行a + b,再執(zhí)行( a + b ) + c的操作。你可能覺得沒什么,那么如下,假設(shè)a之前為1:
c = ( a *= 2 ) + ( a += 3 );
上句執(zhí)行后a為5。而c = ( a += 3 ) + ( a *= 2 );執(zhí)行后,a就是8了。那么c呢?結(jié)果可能會(huì)大大的出乎你的意料。前者的c為10,而后者的c為16。
上面其實(shí)是一個(gè)障眼法,其中的“+”沒有任何意義,即之所以會(huì)從左向右執(zhí)行并不是因?yàn)?/span>“+”的緣故,而是因?yàn)?/span>( a *= 2 )和( a += 3 )的優(yōu)先級(jí)相同,而按照“()”的計(jì)算順序,是從左向右來(lái)計(jì)算的。但為什么c的值不是預(yù)想的2 + 5和4 + 8呢?因?yàn)橘x值操作符的返回值的關(guān)系。
賦值操作符返回的數(shù)字不是變量的值,而是變量對(duì)應(yīng)的地址。這很重要。前面說(shuō)過,光寫一個(gè)變量名就會(huì)返回相應(yīng)變量的值,那是因?yàn)樽兞渴且粋€(gè)映射,變量名就等同于一個(gè)地址。C++中將數(shù)字看作一個(gè)很特殊的操作符,即任何一個(gè)數(shù)字都是一個(gè)操作符。而地址就和長(zhǎng)整型、單精度浮點(diǎn)數(shù)這類一樣,是數(shù)字的一種類型。當(dāng)一個(gè)數(shù)字是地址類型時(shí),作為操作符,其沒有要操作的數(shù)字,僅僅返回將此數(shù)字看作地址而標(biāo)識(shí)的內(nèi)存中的內(nèi)容(用這個(gè)地址的類型來(lái)解釋)。地址可以通過多種途徑得到,如上面光寫一個(gè)變量名就可以得到其對(duì)應(yīng)的地址,而得到的地址的類型也就是相應(yīng)的變量的類型。如果這句話不能理解,在看過下面的類型轉(zhuǎn)換一節(jié)后應(yīng)該就能了解了。
所以前面的c = ( a += 3 ) + ( a *= 2 );,由于“()”的參與改變了優(yōu)先級(jí)而先執(zhí)行了兩個(gè)賦值操作符,然后兩個(gè)賦值操作符都返回a的地址,然后計(jì)算“+”的值,分別計(jì)算兩邊的數(shù)字——a的地址(a的地址也是一個(gè)操作符),也就是已經(jīng)執(zhí)行過兩次賦值操作的a的值,得8,故最后的c為16
類別:默認(rèn)分類 查看評(píng)論
浙公網(wǎng)安備 33010602011771號(hào)