練習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
的類型是vector
、ival
的類型是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 合法。判斷迭代器當前元素是否爲空,然後迭代器遞增。