第五章 5.2節練習 & 5.3.1節練習
練習5.4
說明下列例子的含義,如果存在問題,試著修改它
(a) while(string::iterator iter != s.end()){/*...*/}
(b) while(bool status = find(word)) {/* .. */}
if(!status){/* ... */}
解答:
(a) 每次建立迭代器,並確定它不為end()。while的括號中應該是一個賦值語句,而不是判定語句。
while(string::iterator iter = s.begin(), iter != s.end()){/*...*/} (其中begin只是做個例子,並不一定代表表示式的原始意義)
(b) 每次試圖查詢某個詞,在這個詞被找到的時候,再做一系列操作。
while(bool status = find(word)) {
if(!status){/* ... */}
// ...}
練習5.5
寫一段自己的程式,使用if else語句實現把數字成績轉換為字母成績的要求。
解答:
#include <iostream> #include <vector> #include <string> using namespace std; string res[3] = { "fail", "pass", "high pass" }; int main(){ int grade; while (cin >> grade){ if (grade > 90){ cout << res[2] << endl; } else{ cout << res[grade / 60] << endl; } } }
練習5.6
改寫上一題的程式,使用條件運算子,代替if else語句。
解答:
#include <iostream> #include <vector> #include <string> using namespace std; string res[3] = { "fail", "pass", "high pass" }; int main(){ int grade; while (cin >> grade){ grade > 90 ? (cout << res[2] << endl) : (cout << res[grade / 60] << endl); } }
練習5.7
改正下列程式碼段中的錯誤
(a) if (ival1 != ival2)
ival1 = ival2
else ival1 = ival2 = 0;
(b) if (ival < minval)
minval = ival;
occurs = 1;
(c) if (int ival = get_value())
cout << "ival = " << ival << endl;
if (!ival)
cout << "ival = 0 \n";
(d) if (ival = 0)
ival = get_value();
解答:
(a) 第二行缺少分號
(b) 第二行和第三行應該用大括號括起來
(c) ival不能再第二個if中使用
(d) 這段沒什麼錯誤。不過if語句中的程式碼永遠不會被執行
練習5.8
什麼是“懸垂else”?C++語言是如何處理else子句的?
解答:
【引用】確定else是和哪個if進行匹配的問題,通常稱為“懸垂else”
【引用】C++規定else與離它最近的尚未匹配的if匹配,從而消除了程式的二義性。