《C++ Primer》5th 課後練習 第四章 表達式 11~21

練習4.11 書寫一條表達式用於測試4個值a、b、c、d的關係,確保a大於b、b大於c、c大於d。

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

練習4.12 假設i,j,k 是三個整數,說明表達式 i != j < k 的含義。

相當於i!=(j<k)在進行i!=()時會先將bool類型轉換成int類型,值爲0或1。

練習4.13 在下述語句中,當賦值完成後 i 和 d 的值分別是多少?

int i;   double d;
d = i = 3.5; // i = 3, d = 3.0
i = d = 3.5; // d = 3.5, i = 3

練習4.14 執行下述 if 語句後將發生什麼情況?

if (42 = i)   // 編譯錯誤。賦值運算符左側必須是一個可修改的左值。而字面值是右值。
if (i = 42)   // true.

練習4.15 下面的賦值是非法的,爲什麼?應該如何修改?

double dval; int ival; int *pi;
dval = ival = pi = 0;

pi=0的值是int*類型他不能賦值給int類型變量。

dval = ival = 0;
pi = 0;

練習4.16 儘管下面的語句合法,但它們實際執行的行爲可能和預期並不一樣,爲什麼?應該如何修改?

if (p = getPtr() != 0)
if (i = 1024)

條件判斷總是爲 true, 應該改爲:

if ((p = getPtr()) != 0)
if (i == 1024)

練習4.17 說明前置遞增運算符和後置遞增運算符的區別

前置遞增運算符將對象本身作爲左值返回,後置版本將對象原始值的副本作爲右值返回。

練習4.18 如果132頁那個輸出vector對象元素的while循環使用前置遞增運算符,將得到什麼結果?

會從vector對象的第二個元素開始取值,並且會在輸出第一個負值或對v.end()非法取值後退出。

練習4.19 假設 ptr 的類型是指向 int 的指針、vec 的類型是vectorival 的類型是int,說明下面的表達式是何含義?如果有表達式不正確,爲什麼?應該如何修改?

(a) ptr != 0 && *ptr++  
(b) ival++ && ival
(c) vec[ival++] <= vec[ival] 

a 表示ptr不爲0並且ptr指向的元素也不爲0,並將ptr指針指向後一個元素。

b ival值爲真,並且ival+1的值也爲真

c 未定義錯誤,因爲C++未規定<=號的求值順序,應該改爲vec[ival] <= vec[ival+1]

練習4.20 假設 iter 的類型是 vector::iterator, 說明下面的表達式是否合法。如果合法,表達式的含義是什麼?如果不合法,錯在何處?

(a) *iter++;
(b) (*iter)++;
(c) *iter.empty();
(d) iter->empty();
(e) ++*iter;
(f) iter++->empty();

a 合法,返回迭代器指向的元素,然後迭代器指向下一個元素

b 不合法,string類型不支持自增操作

c 不合法,itre是迭代器類型,沒有empty()成員

d 合法,判斷iter指向的string是否爲空

e 不合法,string類型不支持自增操作

f 合法。判斷迭代器當前元素是否爲空,然後迭代器遞增。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章