小人物學(xué)個(gè)大習(xí)(131-140)
C++ primer
多維數(shù)組,按照由內(nèi)而外的順序理解數(shù)組
int ia[3][4]; //大小為3的數(shù)組,每個(gè)元素是含有4個(gè)整數(shù)的數(shù)組
int (*p)[4] = ia; //p指向含有4個(gè)整數(shù)的數(shù)組
p = &ia[2]; //p指向ia的尾元素
根據(jù)3.5.1節(jié)(第103頁(yè))提出的策略,我們首先明確(*p)意味著p是一個(gè)指針。接著觀察右邊發(fā)現(xiàn),指針p所指的是一個(gè)維度為4的數(shù)組:再觀察左邊知道,數(shù)組中的元素是整數(shù)。因此,p就是指向含有4個(gè)整數(shù)的數(shù)組的指針。一元運(yùn)算符、二元運(yùn)算符
C++的表達(dá)式要不然是右值(rvalue,讀作“are-value”),要不然就是左值(lvalue, 讀作“ell-value”)。這兩個(gè)名詞是從C語(yǔ)言繼承過(guò)來(lái)的,原本是為了幫助記憶:左值可以位于賦值語(yǔ)句的左側(cè),右值則不能。
在C++語(yǔ)言中,二者的區(qū)別就沒(méi)那么簡(jiǎn)單了。一個(gè)左值表達(dá)式的求值結(jié)果是一個(gè)對(duì)象或者一個(gè)函數(shù),然而以常量對(duì)象為代表的某些左值實(shí)際上不能作為賦值語(yǔ)句的左側(cè)運(yùn)算對(duì)象。此外,雖然某些表達(dá)式的求值結(jié)果是對(duì)象,但它們是右值而非左值??梢宰鲆粋€(gè)簡(jiǎn)單的歸納:當(dāng)一個(gè)對(duì)象被用作右值的時(shí)候,用的是對(duì)象的值(內(nèi)容);當(dāng)對(duì)象被用作左值的時(shí)候,用的是對(duì)象的身份(在內(nèi)存中的位置)。優(yōu)先級(jí)與結(jié)合率
從左到右求值順序、優(yōu)先級(jí)、結(jié)合率
例如<<運(yùn)算符是沒(méi)有規(guī)定求值順序的,
cout<< I<<“”<<++I<<endl;
這里的++i的順序是未定義的
只有四種運(yùn)算符明確了計(jì)算順序,&& || ?: ,算數(shù)運(yùn)算符
整數(shù)相除結(jié)果還是整數(shù),也就是說(shuō),如果商含有小數(shù)部分,直接棄除:
int ivall = 2l/6;// ivall是3,結(jié)果進(jìn)行了刪節(jié),余數(shù)被拋棄掉了
int ival2 = 21/7; //ival2是3,沒(méi)有余數(shù),結(jié)果是整數(shù)值
運(yùn)算符%俗稱“取余”或“取?!边\(yùn)算符,負(fù)責(zé)計(jì)算兩個(gè)整數(shù)相除所得的余數(shù),參與回取余運(yùn)算的運(yùn)算對(duì)象必須是整數(shù)類型:
int ival = 42;
double dval = 3.14;
ival % 12; //正確:結(jié)果是6
ival % dval; //錯(cuò)誤:運(yùn)算對(duì)象是浮點(diǎn)類型
在除法運(yùn)算中,如果兩個(gè)運(yùn)算對(duì)象的符號(hào)相同則商為正(如果不為0的話),否則商為負(fù)。C++語(yǔ)言的早期版本允許結(jié)果為負(fù)值的商向上或向下取整,C++11新標(biāo)準(zhǔn)則規(guī)定商律向0取整(即直接切除小數(shù)部分)。
根據(jù)取余運(yùn)算的定義,如果m和n是整數(shù)且n非0,則表達(dá)式(m/n)*n+m%n的求值結(jié)果與m相等。隱含的意思是,如果m%n不等于0,則它的符號(hào)和m相同。
C++語(yǔ)言的早期版本允許m%n的符號(hào)匹配n的符號(hào),而且商向負(fù)無(wú)窮一側(cè)取整,這一方式在新標(biāo)準(zhǔn)中已經(jīng)被禁止使用了。除了-m導(dǎo)致溢出的特殊情況,其他時(shí)候(-m)/n和m/(-n)都等于-(m/n),m%(-n)等于m%n,(-m)%n等于-(m%n)。具體示例如下:
21%6; /結(jié)果是3/
21%7; /結(jié)果是0/
-21%-8; /結(jié)果是-5/
21%-5; /結(jié)果是1/
21 / 6; /結(jié)果是3/
21 / 7; /結(jié)果是3/
-21 /-8; /結(jié)果是2/
21 / -5; /結(jié)果是-4/關(guān)系運(yùn)算符作用于算數(shù)類型或指針類型,邏輯運(yùn)算符作用于任意能轉(zhuǎn)換成布爾值的類型。
邏輯與,邏輯或采用短路求值策略
關(guān)系運(yùn)算符采用左結(jié)合率,并且返回布爾值賦值運(yùn)算符
賦值運(yùn)算的結(jié)果是它的左側(cè)運(yùn)算對(duì)象,并且是一個(gè)左值。
int k = 0;
k = {3.14};錯(cuò)誤,窄化轉(zhuǎn)換
賦值運(yùn)算滿足右結(jié)合率
a = a op b
a += b遞增和遞減運(yùn)算符
j = ++i;j得到遞增之后的值
j = i++;j得到遞增之前的值
除非必須,建議使用前置版本,這樣更快,不用保留前值
p++,等同于(p++),推薦使用的簡(jiǎn)潔寫法
*pbeg = toupper(*pbeg++);該行為未定義,這是由于運(yùn)算順序未定義造成的成員訪問(wèn)運(yùn)算符,點(diǎn)運(yùn)算符和箭頭運(yùn)算符
訪問(wèn)運(yùn)算符的優(yōu)先級(jí)高于解引用運(yùn)算符條件運(yùn)算符
cond?expr1:expr2;
每走一小步,都是一大步。
2023年08月06日