C Primer(第四版)答案之第五章

2021-09-24 22:12:41 字數 3686 閱讀 4383

(12/3)*4+(5*15)+24%(4/2)==16+75+0=91

-30*3+21/5=-90+4=-86,不依賴於機器

-30+3*21/5=-30+12=-18,不依賴於機器

30/3*21%5=0,不依賴於機器

-30/3*21%4=-2,依賴於機器

#include using namespace std;

int main()

溢位指的是計算出的數值超出了資料型別能夠表示的範圍。常見的溢位如下:

// 陣列越界

int a[3];

a[4]=1;

// 除0

int a = 2/0;

// 賦值超過範圍

unsigned short a = 65536;

邏輯與,短路求值,如果第乙個運算元為true,才計算第二個運算元。

邏輯或,短路求值,如果第一運算元為false,才計算第二個運算元。

相等操作符的運算元,不論什麼情況,都需要計算。

如果指標非空且不是'\0',那麼執行迴圈體,用於遍歷字串。

#include using namespace std;

int main()

if(a>b && b>c && c>d)

// process code

ul  0011

ul2 0111

(a) 位運算,與,0011

(b) 邏輯運算,與,true

(c) 位運算,或,0111

(d) 邏輯運算,或,true

bitset<30> a;

a[3] = 1; // set()

a[3] = 0; // reset()

d=i=3.5, 則i=3, d=3.0

i = d = 3.5, 則i=3, d=3.5

第一行編譯錯誤,42是字面值常量,不能賦值

第二行是true,先給變數i賦值42,然後測試i的值,非0表示true。

pi是指標型別,ival是整型,型別不一致,不能相互賦值。

dval = ival = *pi = 0;

(a) 賦值操作符的優先順序低於比較操作符的優先順序,修改為 if((ptr=retrieve_pointer()) != 0)

(b) 賦值操作符,不是比較操作符,賦值操作符,先賦值ival為1024,然後測試ival的值。改為:if(ival==1024)

(c) 賦值操作符的優先順序低於 +操作符,先執行ival+1

前自增操作符,先自增,再返回自增後的值,返回左值,可以被賦值,效率更高。

後自增操作符,先用臨時變數儲存自增前的值,然後自增,然後返回臨時副本,返回的是右值,不能被賦值。

因為,首先是繼承c語言,然後新增了類特性,以及後來的模板、函式式程式設計等。

以迭代器的方式遍歷,通常會忽略掉vector的第乙個元素,而試圖訪問最後乙個元素的下乙個位置。

#include #include #include using namespace std;

int main()

return 0;

}

(a) 合法,輸出iter指向的string,之後iter指向下乙個string

(b) 非法,string物件沒有++操作

(c) 非法,iter是迭代器,也就是指標,沒有empty成員函式。這是由於解引用操作符的優先順序低於點操作符。

(d) 合法,獲取iter指向的string是否為空。

(e) 非法,自增運算的優先順序高於解引用運算子。

(f) 合法,雖然形式很詭異。

#include #include #include using namespace std;

int main()

#include #include #include using namespace std;

int main()

#include #include #include #include using namespace std;

int main()

第乙個輸出是10,也就是陣列的長度。x是陣列名,不是指標,雖然在陣列名當引數進行傳遞的時候,會轉化成指標進行傳遞。同時陣列名也是第乙個元素的首位址。

第二個輸出1。sizeof(p)=4,sizeof(*p)=4。

後自減操作,先使用變數的當前值,下一輪loop的時候,使用自減之後的值。

前自減操作,先使變數自減,然後使用變數的值。

本程式,想在ivec[ix]中儲存,ix之後的元素個數。而5.5節儲存著元素個數是包括當前元素的。

(a) (!ptr) == (ptr->next)

(b) ch = (buf[bp++]!='\n')

(a) !(ptr == ptr->next)

(b) (ch=buf[bp++]) != '\n'

string p1 = s + (s[s.size()-1]=='s'?'':'s')

我認為不可以接受,這是c++自由性氾濫的表現之一。實現效率和可維護性相比根本不值一提,尤其是c++這種表現能力極強的語言。減少潛在的缺陷應該優於實現效率。

(a) 判斷ptr所指物件的ival是否為0

(b) 先判斷jval(c) &&的優先順序最低,先判斷ptr是否空指標,然後判斷ptr所指向的值是否為0

(d) 先執行ival++,判斷ival原始的值,然後判斷ival自加後的值

(e) 非法,未定義,c++對於2目運算子,只有&&,||,定義了計算順序(從左至右),其餘的2目運算子都沒有定義。該表示式行為未定義。

(a) 合法,svec初始化10個元素,每個元素都是空字串(string型別)

(b) 合法,在堆上建立vector,10個元素,元素的型別是string,預設空字串。

(c) 非法,new 陣列,陣列元素個數10,每個元素都是乙個vector, pvec2應該是 vector型別的指標,而不是指標的指標。

(d) 合法,pv1是vector型別的指標

(e) 合法,pv2也是vector型別的指標

(f) 非法,svec不是指標

(g) 合法

(g) 合法

(i) 非法,pv1指向非動態變數

(j) 合法。

(a) fval轉換為bool型別

(b) ival轉換為float型別,相加的結果,轉換為double型別

(c) 通通轉換為double型別

(a) 'a'轉化為int

(b) ival轉化為float,ui轉化為float

(c) ui轉化為float,結果轉化為double

(d) ival先轉化為float,相加的結果轉化為double,最後的結果轉化為char。

int ival;

double dval;

const string *ps;

char *pc;

void *pv;

pv = static_cast(const_cast(ps));

ival = static_cast(*pc);

pv = static_cast(&dval);

pc = static_cast(pv);

c primer大綱(第四版)

第1章 快速入門 第一部分 基本語言 第2章 變數和基本型別 第3章 標準庫型別 第4章 陣列和指標 第5章 表示式 第6章 語句 第7章 函式 第8章 標準io庫 第二部分 容器和演算法 第9章 順序容器 第10章 關聯容器 第11章 泛型演算法 第三部分 類和資料抽象 第12章 類 第13章 複...

C Primer 第四版讀書筆記(五)之語句

通常情況下,語句是順序執行的。但是,除了最簡單的程式外,只有順序執行往往並不足夠。為此,c 定義了一組控制流語句,允許有條件地執行或者重複地執行某部分功能。1.1 簡單語句 c 中,大多數語句以分號結束。表示式語句用於計算表示式。1.2 宣告語句 在c 中,物件或類的定義或宣告也是語句。1.3 復合...

C Primer(第四版)答案之第三章

include using std cin using std cout using std endl int main 所謂預設建構函式是指,當沒有初始化值作為引數的時候,物件調研的建構函式。include include using std cin using std cout using st...