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

練習4.31 本節的程序使用了前置版本的遞增運算符和遞減運算符,解釋爲什麼要用前置版本而不用後置版本。要想使用後置版本的遞增遞減運算符需要做哪些改動?使用後置版本重寫本節的程序。

儘可能用前置的遞增遞減運算符。可以直接將前置的遞增遞減運算符改成後置的遞增遞減運算符。

練習4.32 解釋下面這個循環的含義。

constexpr int size = 5;
int ia[size] = { 1, 2, 3, 4, 5 };
for (int *ptr = ia, ix = 0;
    ix != size && ptr != ia+size;
    ++ix, ++ptr) { /* ... */ }

ptrix分別以指針和索引的方式遍歷ia數組。

練習4.33 根據4.12節中的表說明下面這條表達式的含義。

someValue ? ++x, ++y : --x, --y

優先級排序:++/-- > ? : > , 所以該語句的執行順序爲:

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

含義:如果someValue值爲真則 x,y自增1後返回y的值,丟棄y值,然後自減y,返回y的值,作爲表達式的值;如果someValue值爲假則 x自減1後返回x的值,丟棄x值,然後自減y,返回y的值,作爲表達式的值。

練習4.34 根據本節給出的變量定義,說明下面的表達式中將發生什麼樣的類型轉換:

if(fval)		dval = fval + ival;			dval + ival * cval;

(a) fval -> bool

(b) ival -> float, 加法結果 -> double

© cval -> int, 乘法結果 -> double

練習4.35 假設有如下的定義:

char cval;		int ival;		unsigned int ui;
float fval;		double dval;	

請回答下面的表達式中發生了隱式類型轉換嗎?如果有,指出來。

(a)cval = 'a' + 3;		(b)fval = ui - ival * 1.0;
(c)dval = ui * favl;	(d)cval = ival + fval + dval;

(a)發生了'a'被轉換爲int,之後加法結果轉換爲char

(b)發生了ival被轉換爲double, ui被轉換爲double,加法結果被轉換爲float

©ui首先轉換爲float類型,結果在轉換爲double類型

(d)ival首先轉換爲float類型,第一個加法結果轉換爲double類型,最終結果再轉換爲char類型

練習4.36 假設iint類型,ddouble類型,書寫表達式i*=id使其執行整數類型的乘法而非浮點類型的乘法

i *= static_cast<int>(id);

練習4.37 用命名的強制類型轉換改寫下列舊式的轉換語句

int i; double d; const string *ps; char *pc; void *pv;
(a) pv = (void*)ps;
(b) i = int(*pc);
(c) pv = &d;
(d) pc = (char*)pv;
pv = reinterpret_cast<void*>(const_cast<string*>(ps));
i = static_cast<int>(*pc);
pv = reinterpret_cast<void*>(&d);
pc = reinterpret_cast<char*>(pv);

練習4.38 說明下面這條表達式的含義。

double slope = static_cast<double>(j/i);

j/i 的結果值轉換爲 double,然後賦值給slope。

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