运算符的优先级总能起作用吗?
生活随笔
收集整理的這篇文章主要介紹了
运算符的优先级总能起作用吗?
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
有關(guān)運(yùn)算符優(yōu)先級(jí)的規(guī)則稍微有點(diǎn)復(fù)雜。在大多數(shù)情況下,這些規(guī)則確實(shí)是你所需要的,然而,有人也指出其中的一些規(guī)則本來是可以設(shè)計(jì)得更好的。
讓我們快速地回顧一些有關(guān)內(nèi)容:“運(yùn)算符優(yōu)先級(jí)”是這樣一些規(guī)則的集合——這些規(guī)則規(guī)定了“運(yùn)算符”(例如+,-,等等)的優(yōu)先性,即哪一種運(yùn)算符先參加運(yùn)算。在數(shù)學(xué)中,表達(dá)式“2×3+4×5”和“(2×3)+(4×5)”是等價(jià)的,因?yàn)槌朔ㄟ\(yùn)算在加法運(yùn)算之前進(jìn)行,也就是說乘法的優(yōu)先級(jí)比加法高。
在c中,有16級(jí)以上的運(yùn)算符優(yōu)先級(jí)。盡管這么多的規(guī)則有時(shí)使c程序不易閱讀,但也使C程序?qū)懫饋砣菀锥嗔恕km然這不是唯一的一種折衷方法,但這就是C所采用的方法。表16.1總結(jié)了運(yùn)算符的優(yōu)先級(jí)。
?????????? 表16.1 運(yùn)算符優(yōu)先級(jí)總結(jié)(從高到低)
----------------------------------------------------------------------------------
? 優(yōu)先級(jí)??????????? 運(yùn)算符
----------------------------------------------------------------------------------
? 1??????????????? x[y](下標(biāo))
?????????????????? x(y)(函數(shù)調(diào)用)
?????????????????? x.y(訪問成員)
????????????????? x->y(訪問成員指針)
?????????????????? x++(后綴自增)
?????????????????? x--(后綴自減)--
??? 2???????????? ++x(自增)
?????????????????? --x(自減)
????????????????? &x(取地址)
?????????????????? *x(指針引用)
????????????????? +x(同x,和數(shù)學(xué)中相同)
????????????????? -x(數(shù)學(xué)求負(fù))
????????????????? !x(邏輯非)
????????????????? ~x(按位求反)
???????????????? ? sizeof x和sizeof(x_t)(字節(jié)數(shù)大小)
?? 3???????????????(x_t)y(強(qiáng)制類型轉(zhuǎn)換)
?? 4??????????????x*y(乘法)
?????????????????? x/y(除法)
?????????????????? x%y(求余)
?? 5????????????? x+y(加法)
?????????????????? x-y(減法)
?? 6????????????? x<<y(按位左移)
?????????????????? x>>y(按位右移)
??? 7????????????? x<y,x>y,x<=y,x>=y(關(guān)系比較)
??? 8???????????? x==y,x!=y(相等比較)
??? 9????????????? x&y(按位與)
??? 10???????????? x^y(按位異或)? .
??? 11???????????? x | y(按位或)
??? 12??????????? x&&y(邏輯與)
??? 13???????????? x||y(邏輯或)
??? 14???????????? x?y:z(條件)
????????????????? x=y,x*=y,x/=y,x+=y,x-=y,<<=,>>=,&=,^=,|=(賦值,右結(jié)合性)
??? 16??? x,y(逗號(hào))
--------------------------------------------------------------------------------------
優(yōu)先級(jí)最高的是后綴表達(dá)式,即運(yùn)算符跟在一個(gè)表達(dá)式后面;其次是前綴或單目表達(dá)式,即運(yùn)算符位于一個(gè)表達(dá)式的前面;再次是強(qiáng)制類型轉(zhuǎn)換表達(dá)式。
注意:關(guān)于運(yùn)算符優(yōu)先級(jí),最重要的是知道*p++和*(p++)是等價(jià)的。也就是說,在*p++中,++運(yùn)算符作用在指針上,而不是作用在指針?biāo)赶虻膶?duì)象上。象“*p++=*q++;這樣的代碼在C中是隨處可見的,其中的優(yōu)先級(jí)和“(*(p++))=(*(q++))”中的是相同的。這個(gè)表達(dá)式的含義是“q+1,但仍用q原來的值找到q所指向的對(duì)象;p加1,但仍用p原來的值;把q所指向的對(duì)象賦給p所指向的對(duì)象”,整個(gè)表達(dá)式的值就是原來q所指向的對(duì)象。在C中你會(huì)經(jīng)常看到這樣的代碼,并且你會(huì)有許多機(jī)會(huì)去寫這樣的代碼。對(duì)于其它運(yùn)算符,如果你記不住其優(yōu)先級(jí),可以查閱有關(guān)資料,但是,一個(gè)好的c程序員應(yīng)該連想都不用想就能明白*p++的含義。
最初的C編譯程序是為這樣一種計(jì)算機(jī)編寫的——它的某些指令對(duì)象*p++和*p++=*q++這樣的代碼的處理效率高得令人難以置信,因此,很多C代碼就寫成這種形式了。進(jìn)一步地,因?yàn)橄筮@樣的C代碼實(shí)在太多了,所以新機(jī)型的設(shè)計(jì)者會(huì)保證提供能非常高效地處理這些C代碼的指令。
再下一級(jí)的優(yōu)先級(jí)是乘法、除法和求余(也叫取模),再往后是加法和減法。與數(shù)學(xué)中的表達(dá)式相同,“2*3+4*5”和“(2*3)+(4*5)”是等價(jià)的。
再下一級(jí)是移位運(yùn)算。
再往后兩級(jí)分別是關(guān)系比較(例如x<y)和相等比較(x==y和x!=y)。
再往后三級(jí)分別是按位與、按位異或和按位或。
注意:關(guān)于運(yùn)算符優(yōu)先級(jí),再次重要(即在知道*p++和x=y=z的含義之后)的是要知道x&y==z和(x&y)==z是不一樣的。因?yàn)榘次徊僮鞯倪\(yùn)算符的優(yōu)先級(jí)低于比較運(yùn)算符,所以x&y==z和x&(y==z)是等價(jià)的。這兩個(gè)表達(dá)式的含義都是“先看y和z是否相等(相等為1,不等為0),然后讓比較結(jié)果和x進(jìn)行按位與運(yùn)算”,這與“先讓x和y進(jìn)行按位與運(yùn)算,再比較其結(jié)果是否等于z”相差甚遠(yuǎn)。有人可能會(huì)爭(zhēng)辯,按位與運(yùn)算符的優(yōu)先級(jí)應(yīng)該高于比較運(yùn)算符,但為時(shí)已晚,因?yàn)橄鄳?yīng)的標(biāo)準(zhǔn)是早在二十年前被定義的。如果你想把按位與的結(jié)果與別的東西進(jìn)行比較,你就需要使用括號(hào)。
再往后兩級(jí)是邏輯運(yùn)算符,例如x&&y和x||y。注意,邏輯與(AND)運(yùn)算符的優(yōu)先級(jí)高于邏輯或(OR)運(yùn)算符,這與人們講話的方式是一致的。例如,請(qǐng)看下面的代碼:
??? if(have_ticket&&have_reservation
??? ||have_money && standby_ok){
??? goto_airport();
??? }
這段代碼的含義可以這樣來描述:“如果你有機(jī)票并且預(yù)定了航班,或者你有錢并且可以買到備用票,那么你就可以出發(fā)去機(jī)場(chǎng)了。”如果你用括號(hào)改變優(yōu)先級(jí),你就會(huì)得到一種截然不同的條件:
??? /* not a recommended algorithm!*/
??? if(have_ticket
??? &&(have_reservation || have_money)
??? &&standby_ok){
??? goto airport ();
??? }
這段代碼的含義可以這樣來描述:“如果你有機(jī)票,并且你預(yù)定好了航班或者有錢,并且可以買到備用票,那么你就可以出發(fā)去機(jī)場(chǎng)了。”
再下一級(jí)是條件表達(dá)式,例如x?y:z。這是一個(gè)if-then-else結(jié)構(gòu)的表達(dá)式,而不是一條語句。條件表達(dá)式有時(shí)可以使程序簡(jiǎn)潔,有時(shí)也會(huì)造成語意的模糊。條件表達(dá)式具有右結(jié)合性,也就是說
??? a?b:c?d:e
等價(jià)于
? a?b:(c?d:e)
這一點(diǎn)與else—if結(jié)構(gòu)很相似。
再下一級(jí)是賦值運(yùn)算。所有的賦值運(yùn)算符都具有相同的優(yōu)先級(jí)。與C的其它雙目運(yùn)算符不同,賦值運(yùn)算具有“右結(jié)合性”,即它是從右向左進(jìn)行的,而不是從左向右進(jìn)行的。x+y+z等價(jià)于(x+y)+z,x*y+z等價(jià)于(x*y)+z,而x=y=z等價(jià)于x=(y=z)。
注意:關(guān)于運(yùn)算符優(yōu)先級(jí),次重要(即在知道*p++的含義之后)的是要知道x=y=z的含義。因?yàn)橘x值運(yùn)算具有右結(jié)合性,所以這個(gè)表達(dá)式等價(jià)于x=(y=z),其含義是“將z的值賦給y,然后再將該值賦給x”。象a=b=c=d=O;
這樣的代碼是很常見的,按從右向左的順序,它把。賦給d,再賦給c,再賦給b,最后賦給a。
c中優(yōu)先級(jí)最低的是逗號(hào)運(yùn)算符。它連接兩個(gè)表達(dá)式,先計(jì)算第一個(gè)表達(dá)式的值,扔掉后,再計(jì)算第二個(gè)表達(dá)式的值。只有當(dāng)?shù)谝粋€(gè)表達(dá)式具有副作用時(shí),例如賦值或函數(shù)調(diào)用,使用逗號(hào)運(yùn)算符才有意義。逗號(hào)和賦值運(yùn)算符經(jīng)常在for循環(huán)語句中搭配使用:
??? for(i=0,count=O;i<MAX;++i){
?????? if(interestmg(a[i])){
?????? ++count:
?????? }
??? }
假設(shè)你的程序運(yùn)行在short類型為兩字節(jié)長(zhǎng)的計(jì)算機(jī)上,并且把值258(十進(jìn)制)存放到地址s3000H處的一個(gè)short類型中。因?yàn)閟hort類型的長(zhǎng)度為兩字節(jié),所以該值的一個(gè)字節(jié)存放在3000H處,另一個(gè)字節(jié)存放在3001H處。258(十進(jìn)制)即0102H,所以該值的一個(gè)字節(jié)的內(nèi)容為1,另一個(gè)字節(jié)的內(nèi)容為2。那么,究竟內(nèi)容為1和2的字節(jié)分別是哪一個(gè)呢?
其答案因機(jī)器的不同而不同。在高位優(yōu)先的計(jì)算機(jī)上,高位字節(jié)就是低地址字節(jié)(“高位字節(jié)”指的是其值變化后使整個(gè)字的值變化最大的那個(gè)字節(jié),例如,在值0102H中,01H就是高位字節(jié),而02H是低位字節(jié))。在高位優(yōu)先的計(jì)算機(jī)上,字節(jié)中的內(nèi)容如下所示:
??? 地址??? 2FFEH??? 2FFFH??? 3000H??? 3001H??? 3002H??? 3003H
?? 值????? 01H??? ? 02H
這種圖示方式很直觀——地址就象是尺子上的刻度值,低地址在左,高地址在右。在低位優(yōu)先的計(jì)算機(jī)上,字節(jié)中的內(nèi)容如下所示:
??? 地址??? 3003H??? 3002H??? 3001H??? 3000H??? 2FFFH??? 2FFEH
??? 值????? 01H????? 02H
這種圖示方式同樣很直觀——低位字節(jié)存放在低地址中。
不幸的是,有些計(jì)算機(jī)采用高位優(yōu)先的存儲(chǔ)方式,而另一些計(jì)算機(jī)卻采用低位優(yōu)先的存儲(chǔ)方式。例如,IBM兼容機(jī)和Macintosh機(jī)對(duì)高位字節(jié)和低位字節(jié)的處理方法就不同。
為什么這種區(qū)別會(huì)產(chǎn)生影響呢?試想一下,如果用fwrite()直接把一個(gè)short類型的值按兩字節(jié)存到文件或網(wǎng)絡(luò)上,不考慮格式和是否可讀,而只是存為緊湊的二進(jìn)制形式,會(huì)引起什么后果呢?如果在高位優(yōu)先的計(jì)算機(jī)上存入這個(gè)值,而在低位優(yōu)先的計(jì)算機(jī)上讀出該值(或者反過來),那么存入的是0102H(258),讀出的就是0201H(513)。
解決這個(gè)問題的辦法是選擇一種存儲(chǔ)(和讀取)方式,并且自始至終使用這種方式,而不是按存入內(nèi)存的方式來存儲(chǔ)short或int類型的值。例如,有些標(biāo)準(zhǔn)指定了“網(wǎng)絡(luò)字節(jié)順序(network byte order)”,它是一種高位優(yōu)先順序(即高位字節(jié)存放在低地址中)。例如,如果s是一個(gè)short類型值而a是一個(gè)由兩個(gè)char類型組成的數(shù)組,那么下面這段代碼
??? a[0]=(s>>4)& Oxf;
??? a[1]=s&0xf;
將把s的值按網(wǎng)絡(luò)字節(jié)順序存入a的兩個(gè)字節(jié)中。不管程序是運(yùn)行在高位優(yōu)先或低位優(yōu)先的計(jì)算機(jī)上,s的值都會(huì)存成這種形式。
你可能會(huì)注意到,筆者一直沒有提到哪種計(jì)算機(jī)是高位優(yōu)先或低位優(yōu)先的計(jì)算機(jī)。這樣做是有目的的——如果可移植性是重要的,你就應(yīng)該按這兩種類型的計(jì)算機(jī)都能接受的方式編寫程序;如果效率是重要的,通常你仍然要按這兩種類型的計(jì)算機(jī)都能接受的方式編寫程序。
例如,在高位優(yōu)先的計(jì)算機(jī)上可以用一種更好的方法去實(shí)現(xiàn)上例中的那段代碼,即使你使用了上例中的代碼,一個(gè)好的編譯程序仍然會(huì)利用那種更好的實(shí)現(xiàn)來產(chǎn)生機(jī)器代碼。
注意:“big-endian"和"little-endian"這兩個(gè)名稱來源于Jonathan Swift所寫的《格列佛游記>>(Gulliver's Travels)一書。在格列佛第三次出海時(shí),他遇到了這樣一群人,他們對(duì)煮熟了的雞蛋的吃法爭(zhēng)論不休:有的要先吃大頭,有的要先吃小頭。
“網(wǎng)絡(luò)字節(jié)順序”只適用于int,short和long類型。char類型的值按定義只有一字節(jié)長(zhǎng),因此字節(jié)順序與它無關(guān)。對(duì)于float和double類型的值,沒有一種標(biāo)準(zhǔn)的存儲(chǔ)方式。
???????????????? 表14.9運(yùn)算符優(yōu)先級(jí)
----------------------------------------------------------------
? 運(yùn)算符?????????????????????????????? ? 結(jié)合性???
----------------------------------------------------------------
? () [] ->?????????????????????????????? 自左至右
? ! ~ ++ -- -(類型轉(zhuǎn)換) * &????????????? 自右至左
? sizeof? * / %????????????????????????? 自左至右
? + -??????????????????????????????????? 自左至右
? <<? >>???????????????????????????????? 自左至右
? << =? >>=????????????????????????????? 自左至右
? ==? !=?????????????????????????????????自左至右
? &????????????????????????????????????? 自左至右
? ^????????????????????????????????????? 自左至右
? |????????????????????????????????????? 自左至右
? &&???????????????????????????????????? 自左至右
? ||???????????????????????????????????? 自左至右
? ?:???????????????????????????????????? 自右至左
? =? +=? -=????????????????????????????? 自右至左
? ,????????????????????????????????????? 自左至右
------------------------------------------------------------------
注意,運(yùn)算符“!=”的優(yōu)先級(jí)高于“=”(實(shí)際上,幾乎所有的運(yùn)算符的優(yōu)先級(jí)都高于“=”)。下面兩行語句說明了運(yùn)算符優(yōu)先級(jí)的差異是怎樣給程序員帶來麻煩的:
? ? while(ch=getch()!=27)printf(”Got a character\n”);
? ? while((ch=geteh())!=27)printf("Got a character\n");??? ’
顯然,上述語句的目的是從鍵盤上接收一個(gè)字符,并與十進(jìn)制值27(Escape鍵)進(jìn)行比較。不幸的是,在第一條語句中,getch()與Escape鍵進(jìn)行了比較,其比較結(jié)果(TRUE或FALSE)而不是從鍵盤上輸入的字符被賦給了ch。這是因?yàn)檫\(yùn)算符“!=”的優(yōu)先級(jí)高于“=”。
在第二條語句中,表達(dá)式"ch=geteh()”的外邊加上了括號(hào)。因?yàn)槔ㄌ?hào)的優(yōu)先級(jí)最高,所以來自鍵盤的字符先被賦給ch,然后再與Escape鍵進(jìn)行比較,并把比較結(jié)果(TRUE或FALSE)返回給while語句,這才是程序真正的目的(當(dāng)while的條件為TRUE時(shí),打印相應(yīng)的句子)。需要進(jìn)一步提出的是,與27比較的并不是ch,而是表達(dá)式"ch—getch()”的結(jié)果。在這個(gè)例子中,這一點(diǎn)可能不會(huì)造成什么影響,但括號(hào)確實(shí)可以改變代碼的組織方式和運(yùn)行方式。當(dāng)一個(gè)語句中有多個(gè)用括號(hào)括起來的表達(dá)式時(shí),代碼的執(zhí)行順序是從最里層的括號(hào)到最外層,同層的括號(hào)則從左到右執(zhí)行。
注意,每個(gè)運(yùn)算符在單獨(dú)情況下的結(jié)合性(自左至右,或自右至左)都是不會(huì)改變的,但優(yōu)先級(jí)的順序可以改變。
??? x=15/7;
如果x是一個(gè)整數(shù),x的值將為2。然而,如果用取模運(yùn)算符代替除法運(yùn)算符"/",得到的結(jié)果就不同了:
??? X=15%7;
這個(gè)表達(dá)式的結(jié)果為15除以7的余數(shù),等于1。這就是說,15除以7得2余1。
取模運(yùn)算符通常用來判斷一個(gè)數(shù)是否被另一個(gè)數(shù)整除。例如,如果你要打印字母表中序號(hào)為3的倍數(shù)的字母,你可以使用下面這段代碼:
??? int x;
??? for(x=1; x<=26; x++)
??? if((x%3)==0)
? ? printf("%c"; x+64);??
上例將輸出字符串"cfilorux",即字母表中序號(hào)為3的倍數(shù)的所有字母。
例如,請(qǐng)看一個(gè)使用后綴自增運(yùn)算符的例子:
??? int x, y;
??? x=1;???
??? y=(x++* 5);
上例使用了后綴自增運(yùn)算符,在求得表達(dá)式的值之后,x的值才增加1,因此,y的值為1乘以5,等于5。在求得表達(dá)式的值之后,x自增為2。
現(xiàn)在看一個(gè)使用前綴自增運(yùn)算符的例子:
??? int x, y;
??? x=1;
??? y=(++x*5);
這個(gè)例子和前一個(gè)相同,只不過使用了前綴自增運(yùn)算符,而不是后綴自增運(yùn)算符,因此,x的值先增加1,變?yōu)?,然后才求得表達(dá)式的值。這樣,y的值為2乘以5,等于10。
此外,為了進(jìn)一步優(yōu)化代碼,目前流行的大多數(shù)C編譯程序常常會(huì)改變表達(dá)式的求值順序。因此,你應(yīng)該用括號(hào)明確地指定運(yùn)算符的優(yōu)先級(jí)。例如,請(qǐng)看下述表達(dá)式:
??? a=b+c/d/function—call() * 5
上述表達(dá)式的求值順序非常模糊,你很可能得不到所要的結(jié)果,因此,你最好明確地指定運(yùn)算符的優(yōu)先級(jí):
??? a=b+(((c/d)/function—call())* 5)
這樣,就能確保表達(dá)式被正確求值,而且編譯程序不會(huì)為了優(yōu)化代碼而重新安排運(yùn)算符的優(yōu)先級(jí)了。
??? int X,y;
??? x = 1;??? /*? 1 iS an rvalue,? x is an lvalue? */
??? y=(x+1);??? /*? (x+1)is an rvalue;y is an lvalue? */
在前面已經(jīng)介紹過,一條賦值語句必須有一個(gè)左值和一個(gè)右值,因此,下述語句無法通過編譯,因?yàn)樗鄙僖粋€(gè)右值:
??? int x;
??? x=void_function_call();? /* the{unction void—function—call()
?????????????????????????????? returns nothing */
如果上例中的函數(shù)返回一個(gè)整數(shù),那么它可以被看作一個(gè)右值,因?yàn)樗姆祷刂悼梢源鎯?chǔ)到左值x中。
請(qǐng)參見:
1、什么是左值(lvaule)????
2、數(shù)組可以是左值嗎??
??? int x[5],y[5];
??? x=y;
不過,你可以通過for循環(huán)來遍歷數(shù)組中的每個(gè)元素,并分別對(duì)它們賦值,例如:
??? int i;
??? int x[5];
??? int y[5];
??? ......
??? for(i=0; i<5,i++)
??? x[i]=y[i];
??? ......
此外,你可能想一次拷貝整個(gè)數(shù)組,這可以通過象memcpy()這樣的函數(shù)來實(shí)現(xiàn),例如:
??? memcpy(x,y,sizeof(y));
與數(shù)組不同,結(jié)構(gòu)(structure)可以作為左值。你可以把一個(gè)結(jié)構(gòu)變量賦給另一個(gè)同類型的結(jié)構(gòu)變量,例如:???
??? typedef struct t_name
??? {
??? charlast_name[25];???
? ? char first_name[15];
??? char middle-init [2];
? ? } NAME
? ? ...
? ? NAME my_name, your_name;
? ? ...
? ? your_name = my_name;
? ? ...
在上例中,結(jié)構(gòu)變量my_name的全部?jī)?nèi)容被拷貝到結(jié)構(gòu)變量your_name中,其作用和下述語句是相同的:
??? memcpy(your_name,my_name,sizeof(your_name);
請(qǐng)參見:???
1、什么是左值(lvaule)?
2、什么是右值(rvaule)?
int x;
int *p_int;
x=1;
p_int=5;
變量x是一個(gè)整數(shù),它對(duì)應(yīng)于內(nèi)存中的一個(gè)可存儲(chǔ)位置,因此,在語句“x=1”中,x就是一個(gè)左值。 注意,在第二個(gè)賦值語句“*p_int=5"中,通過“*”修飾符訪問p_int所指向的內(nèi)存區(qū)域;因此,p_int是一個(gè)左值。
相反,下面的幾個(gè)例子就不是左值:
#define CONST_VAL 10
int x
/* example 1 * /
l=x;
/ * example 2 * /
CONST_VAL = 5;
在上述兩條語句中,語句的左側(cè)都是一個(gè)常量,其值不能改變,因?yàn)槌A坎槐硎緝?nèi)存中可
存儲(chǔ)的位置。因此,這兩條賦值語句中沒有左值,編譯程序會(huì)指出它們是錯(cuò)誤的。
請(qǐng)參見:???
1、 數(shù)組(array)可以是左值嗎???? .
2、 什么是右值(rvaule)?
讓我們快速地回顧一些有關(guān)內(nèi)容:“運(yùn)算符優(yōu)先級(jí)”是這樣一些規(guī)則的集合——這些規(guī)則規(guī)定了“運(yùn)算符”(例如+,-,等等)的優(yōu)先性,即哪一種運(yùn)算符先參加運(yùn)算。在數(shù)學(xué)中,表達(dá)式“2×3+4×5”和“(2×3)+(4×5)”是等價(jià)的,因?yàn)槌朔ㄟ\(yùn)算在加法運(yùn)算之前進(jìn)行,也就是說乘法的優(yōu)先級(jí)比加法高。
在c中,有16級(jí)以上的運(yùn)算符優(yōu)先級(jí)。盡管這么多的規(guī)則有時(shí)使c程序不易閱讀,但也使C程序?qū)懫饋砣菀锥嗔恕km然這不是唯一的一種折衷方法,但這就是C所采用的方法。表16.1總結(jié)了運(yùn)算符的優(yōu)先級(jí)。
?????????? 表16.1 運(yùn)算符優(yōu)先級(jí)總結(jié)(從高到低)
----------------------------------------------------------------------------------
? 優(yōu)先級(jí)??????????? 運(yùn)算符
----------------------------------------------------------------------------------
? 1??????????????? x[y](下標(biāo))
?????????????????? x(y)(函數(shù)調(diào)用)
?????????????????? x.y(訪問成員)
????????????????? x->y(訪問成員指針)
?????????????????? x++(后綴自增)
?????????????????? x--(后綴自減)--
??? 2???????????? ++x(自增)
?????????????????? --x(自減)
????????????????? &x(取地址)
?????????????????? *x(指針引用)
????????????????? +x(同x,和數(shù)學(xué)中相同)
????????????????? -x(數(shù)學(xué)求負(fù))
????????????????? !x(邏輯非)
????????????????? ~x(按位求反)
???????????????? ? sizeof x和sizeof(x_t)(字節(jié)數(shù)大小)
?? 3???????????????(x_t)y(強(qiáng)制類型轉(zhuǎn)換)
?? 4??????????????x*y(乘法)
?????????????????? x/y(除法)
?????????????????? x%y(求余)
?? 5????????????? x+y(加法)
?????????????????? x-y(減法)
?? 6????????????? x<<y(按位左移)
?????????????????? x>>y(按位右移)
??? 7????????????? x<y,x>y,x<=y,x>=y(關(guān)系比較)
??? 8???????????? x==y,x!=y(相等比較)
??? 9????????????? x&y(按位與)
??? 10???????????? x^y(按位異或)? .
??? 11???????????? x | y(按位或)
??? 12??????????? x&&y(邏輯與)
??? 13???????????? x||y(邏輯或)
??? 14???????????? x?y:z(條件)
????????????????? x=y,x*=y,x/=y,x+=y,x-=y,<<=,>>=,&=,^=,|=(賦值,右結(jié)合性)
??? 16??? x,y(逗號(hào))
--------------------------------------------------------------------------------------
優(yōu)先級(jí)最高的是后綴表達(dá)式,即運(yùn)算符跟在一個(gè)表達(dá)式后面;其次是前綴或單目表達(dá)式,即運(yùn)算符位于一個(gè)表達(dá)式的前面;再次是強(qiáng)制類型轉(zhuǎn)換表達(dá)式。
注意:關(guān)于運(yùn)算符優(yōu)先級(jí),最重要的是知道*p++和*(p++)是等價(jià)的。也就是說,在*p++中,++運(yùn)算符作用在指針上,而不是作用在指針?biāo)赶虻膶?duì)象上。象“*p++=*q++;這樣的代碼在C中是隨處可見的,其中的優(yōu)先級(jí)和“(*(p++))=(*(q++))”中的是相同的。這個(gè)表達(dá)式的含義是“q+1,但仍用q原來的值找到q所指向的對(duì)象;p加1,但仍用p原來的值;把q所指向的對(duì)象賦給p所指向的對(duì)象”,整個(gè)表達(dá)式的值就是原來q所指向的對(duì)象。在C中你會(huì)經(jīng)常看到這樣的代碼,并且你會(huì)有許多機(jī)會(huì)去寫這樣的代碼。對(duì)于其它運(yùn)算符,如果你記不住其優(yōu)先級(jí),可以查閱有關(guān)資料,但是,一個(gè)好的c程序員應(yīng)該連想都不用想就能明白*p++的含義。
最初的C編譯程序是為這樣一種計(jì)算機(jī)編寫的——它的某些指令對(duì)象*p++和*p++=*q++這樣的代碼的處理效率高得令人難以置信,因此,很多C代碼就寫成這種形式了。進(jìn)一步地,因?yàn)橄筮@樣的C代碼實(shí)在太多了,所以新機(jī)型的設(shè)計(jì)者會(huì)保證提供能非常高效地處理這些C代碼的指令。
再下一級(jí)的優(yōu)先級(jí)是乘法、除法和求余(也叫取模),再往后是加法和減法。與數(shù)學(xué)中的表達(dá)式相同,“2*3+4*5”和“(2*3)+(4*5)”是等價(jià)的。
再下一級(jí)是移位運(yùn)算。
再往后兩級(jí)分別是關(guān)系比較(例如x<y)和相等比較(x==y和x!=y)。
再往后三級(jí)分別是按位與、按位異或和按位或。
注意:關(guān)于運(yùn)算符優(yōu)先級(jí),再次重要(即在知道*p++和x=y=z的含義之后)的是要知道x&y==z和(x&y)==z是不一樣的。因?yàn)榘次徊僮鞯倪\(yùn)算符的優(yōu)先級(jí)低于比較運(yùn)算符,所以x&y==z和x&(y==z)是等價(jià)的。這兩個(gè)表達(dá)式的含義都是“先看y和z是否相等(相等為1,不等為0),然后讓比較結(jié)果和x進(jìn)行按位與運(yùn)算”,這與“先讓x和y進(jìn)行按位與運(yùn)算,再比較其結(jié)果是否等于z”相差甚遠(yuǎn)。有人可能會(huì)爭(zhēng)辯,按位與運(yùn)算符的優(yōu)先級(jí)應(yīng)該高于比較運(yùn)算符,但為時(shí)已晚,因?yàn)橄鄳?yīng)的標(biāo)準(zhǔn)是早在二十年前被定義的。如果你想把按位與的結(jié)果與別的東西進(jìn)行比較,你就需要使用括號(hào)。
再往后兩級(jí)是邏輯運(yùn)算符,例如x&&y和x||y。注意,邏輯與(AND)運(yùn)算符的優(yōu)先級(jí)高于邏輯或(OR)運(yùn)算符,這與人們講話的方式是一致的。例如,請(qǐng)看下面的代碼:
??? if(have_ticket&&have_reservation
??? ||have_money && standby_ok){
??? goto_airport();
??? }
這段代碼的含義可以這樣來描述:“如果你有機(jī)票并且預(yù)定了航班,或者你有錢并且可以買到備用票,那么你就可以出發(fā)去機(jī)場(chǎng)了。”如果你用括號(hào)改變優(yōu)先級(jí),你就會(huì)得到一種截然不同的條件:
??? /* not a recommended algorithm!*/
??? if(have_ticket
??? &&(have_reservation || have_money)
??? &&standby_ok){
??? goto airport ();
??? }
這段代碼的含義可以這樣來描述:“如果你有機(jī)票,并且你預(yù)定好了航班或者有錢,并且可以買到備用票,那么你就可以出發(fā)去機(jī)場(chǎng)了。”
再下一級(jí)是條件表達(dá)式,例如x?y:z。這是一個(gè)if-then-else結(jié)構(gòu)的表達(dá)式,而不是一條語句。條件表達(dá)式有時(shí)可以使程序簡(jiǎn)潔,有時(shí)也會(huì)造成語意的模糊。條件表達(dá)式具有右結(jié)合性,也就是說
??? a?b:c?d:e
等價(jià)于
? a?b:(c?d:e)
這一點(diǎn)與else—if結(jié)構(gòu)很相似。
再下一級(jí)是賦值運(yùn)算。所有的賦值運(yùn)算符都具有相同的優(yōu)先級(jí)。與C的其它雙目運(yùn)算符不同,賦值運(yùn)算具有“右結(jié)合性”,即它是從右向左進(jìn)行的,而不是從左向右進(jìn)行的。x+y+z等價(jià)于(x+y)+z,x*y+z等價(jià)于(x*y)+z,而x=y=z等價(jià)于x=(y=z)。
注意:關(guān)于運(yùn)算符優(yōu)先級(jí),次重要(即在知道*p++的含義之后)的是要知道x=y=z的含義。因?yàn)橘x值運(yùn)算具有右結(jié)合性,所以這個(gè)表達(dá)式等價(jià)于x=(y=z),其含義是“將z的值賦給y,然后再將該值賦給x”。象a=b=c=d=O;
這樣的代碼是很常見的,按從右向左的順序,它把。賦給d,再賦給c,再賦給b,最后賦給a。
c中優(yōu)先級(jí)最低的是逗號(hào)運(yùn)算符。它連接兩個(gè)表達(dá)式,先計(jì)算第一個(gè)表達(dá)式的值,扔掉后,再計(jì)算第二個(gè)表達(dá)式的值。只有當(dāng)?shù)谝粋€(gè)表達(dá)式具有副作用時(shí),例如賦值或函數(shù)調(diào)用,使用逗號(hào)運(yùn)算符才有意義。逗號(hào)和賦值運(yùn)算符經(jīng)常在for循環(huán)語句中搭配使用:
??? for(i=0,count=O;i<MAX;++i){
?????? if(interestmg(a[i])){
?????? ++count:
?????? }
??? }
高位優(yōu)先(big—endian)與低位優(yōu)先(little-endian)的計(jì)算機(jī)有什么區(qū)別?
高位優(yōu)先與低位優(yōu)先的區(qū)別僅僅在于一個(gè)字的哪一端是高位字節(jié)。換句話說,兩者的區(qū)別在于你是喜歡從左向右數(shù),還是喜歡從右向左數(shù)。但是,哪種方式都不見得比另一種方式更好。一個(gè)可移植的C程序必須能同時(shí)適用于這兩種類型的計(jì)算機(jī)。假設(shè)你的程序運(yùn)行在short類型為兩字節(jié)長(zhǎng)的計(jì)算機(jī)上,并且把值258(十進(jìn)制)存放到地址s3000H處的一個(gè)short類型中。因?yàn)閟hort類型的長(zhǎng)度為兩字節(jié),所以該值的一個(gè)字節(jié)存放在3000H處,另一個(gè)字節(jié)存放在3001H處。258(十進(jìn)制)即0102H,所以該值的一個(gè)字節(jié)的內(nèi)容為1,另一個(gè)字節(jié)的內(nèi)容為2。那么,究竟內(nèi)容為1和2的字節(jié)分別是哪一個(gè)呢?
其答案因機(jī)器的不同而不同。在高位優(yōu)先的計(jì)算機(jī)上,高位字節(jié)就是低地址字節(jié)(“高位字節(jié)”指的是其值變化后使整個(gè)字的值變化最大的那個(gè)字節(jié),例如,在值0102H中,01H就是高位字節(jié),而02H是低位字節(jié))。在高位優(yōu)先的計(jì)算機(jī)上,字節(jié)中的內(nèi)容如下所示:
??? 地址??? 2FFEH??? 2FFFH??? 3000H??? 3001H??? 3002H??? 3003H
?? 值????? 01H??? ? 02H
這種圖示方式很直觀——地址就象是尺子上的刻度值,低地址在左,高地址在右。在低位優(yōu)先的計(jì)算機(jī)上,字節(jié)中的內(nèi)容如下所示:
??? 地址??? 3003H??? 3002H??? 3001H??? 3000H??? 2FFFH??? 2FFEH
??? 值????? 01H????? 02H
這種圖示方式同樣很直觀——低位字節(jié)存放在低地址中。
不幸的是,有些計(jì)算機(jī)采用高位優(yōu)先的存儲(chǔ)方式,而另一些計(jì)算機(jī)卻采用低位優(yōu)先的存儲(chǔ)方式。例如,IBM兼容機(jī)和Macintosh機(jī)對(duì)高位字節(jié)和低位字節(jié)的處理方法就不同。
為什么這種區(qū)別會(huì)產(chǎn)生影響呢?試想一下,如果用fwrite()直接把一個(gè)short類型的值按兩字節(jié)存到文件或網(wǎng)絡(luò)上,不考慮格式和是否可讀,而只是存為緊湊的二進(jìn)制形式,會(huì)引起什么后果呢?如果在高位優(yōu)先的計(jì)算機(jī)上存入這個(gè)值,而在低位優(yōu)先的計(jì)算機(jī)上讀出該值(或者反過來),那么存入的是0102H(258),讀出的就是0201H(513)。
解決這個(gè)問題的辦法是選擇一種存儲(chǔ)(和讀取)方式,并且自始至終使用這種方式,而不是按存入內(nèi)存的方式來存儲(chǔ)short或int類型的值。例如,有些標(biāo)準(zhǔn)指定了“網(wǎng)絡(luò)字節(jié)順序(network byte order)”,它是一種高位優(yōu)先順序(即高位字節(jié)存放在低地址中)。例如,如果s是一個(gè)short類型值而a是一個(gè)由兩個(gè)char類型組成的數(shù)組,那么下面這段代碼
??? a[0]=(s>>4)& Oxf;
??? a[1]=s&0xf;
將把s的值按網(wǎng)絡(luò)字節(jié)順序存入a的兩個(gè)字節(jié)中。不管程序是運(yùn)行在高位優(yōu)先或低位優(yōu)先的計(jì)算機(jī)上,s的值都會(huì)存成這種形式。
你可能會(huì)注意到,筆者一直沒有提到哪種計(jì)算機(jī)是高位優(yōu)先或低位優(yōu)先的計(jì)算機(jī)。這樣做是有目的的——如果可移植性是重要的,你就應(yīng)該按這兩種類型的計(jì)算機(jī)都能接受的方式編寫程序;如果效率是重要的,通常你仍然要按這兩種類型的計(jì)算機(jī)都能接受的方式編寫程序。
例如,在高位優(yōu)先的計(jì)算機(jī)上可以用一種更好的方法去實(shí)現(xiàn)上例中的那段代碼,即使你使用了上例中的代碼,一個(gè)好的編譯程序仍然會(huì)利用那種更好的實(shí)現(xiàn)來產(chǎn)生機(jī)器代碼。
注意:“big-endian"和"little-endian"這兩個(gè)名稱來源于Jonathan Swift所寫的《格列佛游記>>(Gulliver's Travels)一書。在格列佛第三次出海時(shí),他遇到了這樣一群人,他們對(duì)煮熟了的雞蛋的吃法爭(zhēng)論不休:有的要先吃大頭,有的要先吃小頭。
“網(wǎng)絡(luò)字節(jié)順序”只適用于int,short和long類型。char類型的值按定義只有一字節(jié)長(zhǎng),因此字節(jié)順序與它無關(guān)。對(duì)于float和double類型的值,沒有一種標(biāo)準(zhǔn)的存儲(chǔ)方式。
C語言運(yùn)算符的優(yōu)先級(jí)總能起作用嗎(從左至右,從右至左)?
如果你是指“一個(gè)運(yùn)算符的結(jié)合性會(huì)從自右至左變?yōu)樽宰笾劣覇?反過來會(huì)嗎?”,那么答案是否定的。如果你是指“一個(gè)優(yōu)先級(jí)較低的運(yùn)算符會(huì)先于一個(gè)優(yōu)先級(jí)較高的運(yùn)算符被執(zhí)行嗎?”,那么答案是肯定的。表14.9按優(yōu)先級(jí)從高到低的順序列出了所有的運(yùn)算符及其結(jié)合性:???????????????? 表14.9運(yùn)算符優(yōu)先級(jí)
----------------------------------------------------------------
? 運(yùn)算符?????????????????????????????? ? 結(jié)合性???
----------------------------------------------------------------
? () [] ->?????????????????????????????? 自左至右
? ! ~ ++ -- -(類型轉(zhuǎn)換) * &????????????? 自右至左
? sizeof? * / %????????????????????????? 自左至右
? + -??????????????????????????????????? 自左至右
? <<? >>???????????????????????????????? 自左至右
? << =? >>=????????????????????????????? 自左至右
? ==? !=?????????????????????????????????自左至右
? &????????????????????????????????????? 自左至右
? ^????????????????????????????????????? 自左至右
? |????????????????????????????????????? 自左至右
? &&???????????????????????????????????? 自左至右
? ||???????????????????????????????????? 自左至右
? ?:???????????????????????????????????? 自右至左
? =? +=? -=????????????????????????????? 自右至左
? ,????????????????????????????????????? 自左至右
------------------------------------------------------------------
注意,運(yùn)算符“!=”的優(yōu)先級(jí)高于“=”(實(shí)際上,幾乎所有的運(yùn)算符的優(yōu)先級(jí)都高于“=”)。下面兩行語句說明了運(yùn)算符優(yōu)先級(jí)的差異是怎樣給程序員帶來麻煩的:
? ? while(ch=getch()!=27)printf(”Got a character\n”);
? ? while((ch=geteh())!=27)printf("Got a character\n");??? ’
顯然,上述語句的目的是從鍵盤上接收一個(gè)字符,并與十進(jìn)制值27(Escape鍵)進(jìn)行比較。不幸的是,在第一條語句中,getch()與Escape鍵進(jìn)行了比較,其比較結(jié)果(TRUE或FALSE)而不是從鍵盤上輸入的字符被賦給了ch。這是因?yàn)檫\(yùn)算符“!=”的優(yōu)先級(jí)高于“=”。
在第二條語句中,表達(dá)式"ch=geteh()”的外邊加上了括號(hào)。因?yàn)槔ㄌ?hào)的優(yōu)先級(jí)最高,所以來自鍵盤的字符先被賦給ch,然后再與Escape鍵進(jìn)行比較,并把比較結(jié)果(TRUE或FALSE)返回給while語句,這才是程序真正的目的(當(dāng)while的條件為TRUE時(shí),打印相應(yīng)的句子)。需要進(jìn)一步提出的是,與27比較的并不是ch,而是表達(dá)式"ch—getch()”的結(jié)果。在這個(gè)例子中,這一點(diǎn)可能不會(huì)造成什么影響,但括號(hào)確實(shí)可以改變代碼的組織方式和運(yùn)行方式。當(dāng)一個(gè)語句中有多個(gè)用括號(hào)括起來的表達(dá)式時(shí),代碼的執(zhí)行順序是從最里層的括號(hào)到最外層,同層的括號(hào)則從左到右執(zhí)行。
注意,每個(gè)運(yùn)算符在單獨(dú)情況下的結(jié)合性(自左至右,或自右至左)都是不會(huì)改變的,但優(yōu)先級(jí)的順序可以改變。
C語言取模運(yùn)算符(modulus operator)“%”的作用是什么
取模運(yùn)算符“%”的作用是求兩個(gè)數(shù)相除的余數(shù)。例如,請(qǐng)看下面這段代碼:??? x=15/7;
如果x是一個(gè)整數(shù),x的值將為2。然而,如果用取模運(yùn)算符代替除法運(yùn)算符"/",得到的結(jié)果就不同了:
??? X=15%7;
這個(gè)表達(dá)式的結(jié)果為15除以7的余數(shù),等于1。這就是說,15除以7得2余1。
取模運(yùn)算符通常用來判斷一個(gè)數(shù)是否被另一個(gè)數(shù)整除。例如,如果你要打印字母表中序號(hào)為3的倍數(shù)的字母,你可以使用下面這段代碼:
??? int x;
??? for(x=1; x<=26; x++)
??? if((x%3)==0)
? ? printf("%c"; x+64);??
上例將輸出字符串"cfilorux",即字母表中序號(hào)為3的倍數(shù)的所有字母。
++var和var++有什么區(qū)別(C語言自增自減詳解)
“++”運(yùn)算符被稱為自增運(yùn)算符。如果“++”運(yùn)算符出現(xiàn)在變量的前面(++var),那么在表達(dá)式使用變量之前,變量的值將增加1。如果“++”運(yùn)算符出現(xiàn)在變量之后(var++),那么先對(duì)表達(dá)式求值,然后變量的值才增加1。對(duì)自減運(yùn)算符(--)來說,情況完全相同。如果運(yùn)算符出現(xiàn)在變量的前面,則相應(yīng)的運(yùn)算被稱為前綴運(yùn)算;反之,則稱為后綴運(yùn)算。例如,請(qǐng)看一個(gè)使用后綴自增運(yùn)算符的例子:
??? int x, y;
??? x=1;???
??? y=(x++* 5);
上例使用了后綴自增運(yùn)算符,在求得表達(dá)式的值之后,x的值才增加1,因此,y的值為1乘以5,等于5。在求得表達(dá)式的值之后,x自增為2。
現(xiàn)在看一個(gè)使用前綴自增運(yùn)算符的例子:
??? int x, y;
??? x=1;
??? y=(++x*5);
這個(gè)例子和前一個(gè)相同,只不過使用了前綴自增運(yùn)算符,而不是后綴自增運(yùn)算符,因此,x的值先增加1,變?yōu)?,然后才求得表達(dá)式的值。這樣,y的值為2乘以5,等于10。
C語言運(yùn)算符的優(yōu)先級(jí)總能保證是“自左至右”或“自右至左”的順序嗎
對(duì)這個(gè)問題的簡(jiǎn)單回答是:這兩種順序都無法保證。C語言并不總是自左至右或自右至左求值,一般說來,它首先求函數(shù)值,其次求復(fù)雜表達(dá)式的值,最后求簡(jiǎn)單表達(dá)式的值。此外,為了進(jìn)一步優(yōu)化代碼,目前流行的大多數(shù)C編譯程序常常會(huì)改變表達(dá)式的求值順序。因此,你應(yīng)該用括號(hào)明確地指定運(yùn)算符的優(yōu)先級(jí)。例如,請(qǐng)看下述表達(dá)式:
??? a=b+c/d/function—call() * 5
上述表達(dá)式的求值順序非常模糊,你很可能得不到所要的結(jié)果,因此,你最好明確地指定運(yùn)算符的優(yōu)先級(jí):
??? a=b+(((c/d)/function—call())* 5)
這樣,就能確保表達(dá)式被正確求值,而且編譯程序不會(huì)為了優(yōu)化代碼而重新安排運(yùn)算符的優(yōu)先級(jí)了。
C語言右值(rvaule)是什么
在1.9中,左值被定義為可被賦值的表達(dá)式,你也可以認(rèn)為左值是出現(xiàn)在賦值語句左邊的表達(dá)式。這樣,右值就可以被定義為能賦值的表達(dá)式,它出現(xiàn)在賦值語句的右邊。與左值不同,右值可以是常量或表達(dá)式:例如:?????? int X,y;
??? x = 1;??? /*? 1 iS an rvalue,? x is an lvalue? */
??? y=(x+1);??? /*? (x+1)is an rvalue;y is an lvalue? */
在前面已經(jīng)介紹過,一條賦值語句必須有一個(gè)左值和一個(gè)右值,因此,下述語句無法通過編譯,因?yàn)樗鄙僖粋€(gè)右值:
??? int x;
??? x=void_function_call();? /* the{unction void—function—call()
?????????????????????????????? returns nothing */
如果上例中的函數(shù)返回一個(gè)整數(shù),那么它可以被看作一個(gè)右值,因?yàn)樗姆祷刂悼梢源鎯?chǔ)到左值x中。
請(qǐng)參見:
1、什么是左值(lvaule)????
2、數(shù)組可以是左值嗎??
C語言數(shù)組(array)可以是左值嗎
在1.9中,左值被定義為可被賦值的表達(dá)式。那么,數(shù)組是可被賦值的表達(dá)式嗎?不是,因?yàn)閿?shù)組是由若干獨(dú)立的數(shù)組元素組成的,這些元素不能作為一個(gè)整體被賦值。下述語句是非法的:??? int x[5],y[5];
??? x=y;
不過,你可以通過for循環(huán)來遍歷數(shù)組中的每個(gè)元素,并分別對(duì)它們賦值,例如:
??? int i;
??? int x[5];
??? int y[5];
??? ......
??? for(i=0; i<5,i++)
??? x[i]=y[i];
??? ......
此外,你可能想一次拷貝整個(gè)數(shù)組,這可以通過象memcpy()這樣的函數(shù)來實(shí)現(xiàn),例如:
??? memcpy(x,y,sizeof(y));
與數(shù)組不同,結(jié)構(gòu)(structure)可以作為左值。你可以把一個(gè)結(jié)構(gòu)變量賦給另一個(gè)同類型的結(jié)構(gòu)變量,例如:???
??? typedef struct t_name
??? {
??? charlast_name[25];???
? ? char first_name[15];
??? char middle-init [2];
? ? } NAME
? ? ...
? ? NAME my_name, your_name;
? ? ...
? ? your_name = my_name;
? ? ...
在上例中,結(jié)構(gòu)變量my_name的全部?jī)?nèi)容被拷貝到結(jié)構(gòu)變量your_name中,其作用和下述語句是相同的:
??? memcpy(your_name,my_name,sizeof(your_name);
請(qǐng)參見:???
1、什么是左值(lvaule)?
2、什么是右值(rvaule)?
什么是C語言左值(lvaule)
左值是指可以被賦值的表達(dá)式。左值位于賦值語句的左側(cè),與其相對(duì)的右值(rvaule,見 1.11)則位于賦值語句的右側(cè)。每條賦值語句都必須有一個(gè)左值和一個(gè)右值。左值必須是內(nèi)存中一個(gè)可存儲(chǔ)的變量,而不能是一個(gè)常量。下面給出了一些左值的例子:int x;
int *p_int;
x=1;
p_int=5;
變量x是一個(gè)整數(shù),它對(duì)應(yīng)于內(nèi)存中的一個(gè)可存儲(chǔ)位置,因此,在語句“x=1”中,x就是一個(gè)左值。 注意,在第二個(gè)賦值語句“*p_int=5"中,通過“*”修飾符訪問p_int所指向的內(nèi)存區(qū)域;因此,p_int是一個(gè)左值。
相反,下面的幾個(gè)例子就不是左值:
#define CONST_VAL 10
int x
/* example 1 * /
l=x;
/ * example 2 * /
CONST_VAL = 5;
在上述兩條語句中,語句的左側(cè)都是一個(gè)常量,其值不能改變,因?yàn)槌A坎槐硎緝?nèi)存中可
存儲(chǔ)的位置。因此,這兩條賦值語句中沒有左值,編譯程序會(huì)指出它們是錯(cuò)誤的。
請(qǐng)參見:???
1、 數(shù)組(array)可以是左值嗎???? .
2、 什么是右值(rvaule)?
總結(jié)
以上是生活随笔為你收集整理的运算符的优先级总能起作用吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCL 第5课:向量相加
- 下一篇: 交通银行太平洋etc信用卡年费多少?送你