C PRIMER第四章練習

2021-08-09 01:19:02 字數 2648 閱讀 5333

4.1 先乘除後加減,105

4.2a)*(vec.begin())

b)(*(vec.begin()))+1

4.3可以接受,可以提高編譯器效率,潛在缺陷只要注意不讓表示式指向並修改同一物件就可以忽略

4.4((12/3)*4)+(5*15)+((24%4)/2)=91

4.5a)-86

b)-18

c)0d)-2

4.6if(ival%2)為真時奇數,為假時偶數

4.7當計算的結果超出該型別的範圍就會溢位;

4.8邏輯與,僅當左側為真時計算右側;

邏輯或,僅當左側為假時計算右側;

相等性,按照提公升轉化

4.9先判斷cp是否是個空指標,再判斷cp指向的字元是否為空,如果都不是則條件為真

4.10

while(cin>>i&&i!=42)

4.11

a>b&&b>c&&c>d

4.12

先判斷表示式i!=j的值,如果為真,則轉化為1與k比較,否則轉化為0與k比較

4.13

a)d=3,i=3;

b)d=3.5,i=3;

4.14

第乙個非法,試圖給數值常量賦值,第二個條件恒為真

4.15

連續賦值滿足右結合律,最右邊的pi=0,此時代表的是乙個指標,然後試圖給整型常量ival賦乙個指標的值,

dval=ival=0;pi=nullptr;

4.16

a)!=優先順序優於=,改為if((p=getptr())!=0)

b)條件恒為真,明顯與預期不符,改為if(1024==i)

4.17

前置版本返回原物件引用,後置版本返回原物件副本

4.18

先將pbeg+1,然後對pbeg+1解引用,這樣會導致不輸出第乙個數,而試圖對超尾位址解引用,導致非法

4.19

a)ptr非空指標,且指向的值不為0,然後將ptr指標向前移動乙個位置

b)左邊表示式改變ival的值,而右邊表示式又要使用ival,這將引發錯誤或產生未定義的行為~~改為ival++即可

c)如果ival下標合法,該表示式恒為真,然後將ival加1

4.20

a)合法,對iter解引用,然後將iter+1

b)合法,對iter解引用,然後將解引用後的資料+1

c)非法,iter 是乙個迭代器,它沒有名為empty的成員

d)合法,iter指向的字串是否為空

e)合法,先對iter解引用,然後將解引用後的資料+1

f)合法,先看iter是否指向空串,然後再將iter+1

4.21

for(auto& val:vec)

val=val%2?val*2:val;

4.22

finalgrade=grade>90?"high pass"

:grade>75?"pass"

:grade>60?"low pass":"fail";

if語句更容易理解

4.23

無法將string與bool值相加;

string pl=s+(s[s.size()-1]=='s'?"":"s");

4.24

(grade<60)?」fail」:(grade>90)?」high pass」:」pass」;

4.25

先提公升為int  0x00000071

然後求反為0xffffff8d,往左移6位後11 11111111 11111111 10001110 000000

4.26

int在有些機器上是16位的,而 quizl要至少27位

4.27

a)011&111=011,為3

b)011|111=111,為7

c)3&&7為bool值,true

d)3||7為bool值,true

4.28

cout<4.29

4.30

a) sizeof(x)+y

b)sizeof(p->mem[i])

c)sizeof(a)d)sizeof(f())

4.31

效率問題,乙個返回左值,乙個返回副本

4.32

遍歷陣列同時指標ptr移到超尾位置

4.33

條件運算優先順序比逗號高

(somevalue?++x,++y:--x),--y

4.34

a)fval轉化為bool

b)ival轉化為float,然後相加的值轉化為 double

c)cval轉化為int,然後相乘的值轉化為double

4.35

a)有,'a'轉化為int,然後值轉為char

b)有,ui轉為double然後轉到float

c)有,float轉為double

d)有,ival先轉為float,然後跟fval相加後轉為double,最後值再轉回char

4.36

i*=static_cast(d)

4.37

a)pv=const_cast(ps)

b)i=static_cast(*pc)

c)pv=static_cast(&d)

d)pc=reinterpret_cast(char*)pv

4.38

將j/i的值強制轉化為double型賦給slope

C Primer 學習(第四章)

1.左值和右值 c 中可以這樣簡單的理解左值和右值 能夠取位址的 有名字的就是左值,反之,不能取位址的 沒有名字的就是右值。當乙個物件被用作右值的時候,用的是物件的值 內容 當物件被用作左值的時候,用的是物件的身份 在記憶體中的位置 乙個重要的原則是在需要右值的地方可以用左值來代替,但是不能把右值當...

C Primer 第四章筆記

左值和右值 乙個左值表示式的求職結果是乙個物件或者乙個函式,然而以常量物件為代表的某些左值實際上不能作為賦值語句的左側運算物件。當乙個物件用作右值的時候,用的是物件的值 內容 當物件被用作左值的時候,用的是物件的身份 在記憶體中的位置 對於某些沒有執行順序的運算子來說,如果表示式指向並修改了同乙個物...

C primer 第四章筆記 初稿

左值和右值 求值順序 號對布林運算無效 溢位運算 取餘運算可以為負,但不可以為浮點數 m n n m m n m n m n,m n m n 如果想右結合連續賦值,就必須滿足變數型別相同或可相互轉化 優先選擇前置遞增而不是後置遞增 後置遞增運算子優先順序高於解引用運算子 位運算存在一定的公升級擴容,...