CPP 5. 循环和关系表达式 2020-10-16 浏览量 591 暂无评论 # 第5章 循环和关系表达式 ## 5.1 for循环 注意: 1. test-expression(测试表达式)可以使用任意表达式,不是只能为真或假,C++将结果强制转换为bool类型; 2. for循环是入口条件循环,意味着在每轮循环之前,都将计算测试表达式的值; 3. for语句的控制部分使用3个表达式,而在C++中,任何值或任何有效的值和运算符的组合都是表达式(表达式加分号成为语句,但语句去掉分号不一定是表达式),C++将赋值表达式的值定义为左侧成员的值; 4. 完整表达式--表达式语句中的表达式部分,while循环中检测条件的表达式。任何完整的表达式末尾都是一个顺序(点),C++确保执行下一跳语句前,完整表达式的所有操作被执行完毕; 5. 逗号表达式的值是最后一部分的值,逗号运算符的优先级是最低的; 6. 循环体必须是一条语句,该语句可以是**复合语句或者用逗号运算符合并**出的语句,使用像python那样的缩进是不行的,那样只有第一条语句被当作循环体; 7. 复合语句中定义的变量只在该复合语句内有效; **for循环语法** ```cpp #include int main() { using namespace std; int i; // init; test; update for (i = 0; i < 5; i++) // for (int i = 0; i < 5; i++) cout << "You are so smart!\n"; cout << "Stop.\n"; return 0; } // 不完整的表达式,下式中的4 + x++ y = (4 + x++) + (6 + x++); // 逗号运算符 a = (i = 20, j = 2 * i); // a = 40, i = 20, j = 40 a = i = 20, j = 2 * i; // a = 20, i = 20, j = 40 ``` **复合语句,逗号运算符合并语句** ```cpp #include #include int main() { using namespace std; cout << "Enter a word: " string word; cin >> word; chat temp; int i, j; for (j = 0, i = word.size() - 1; j < i; --i, ++j) { temp = word[i]; word[i] = word[j]; word[j] = temp; } cout << word << "\nDone\n"; return 0; } ``` ## 5.2 while循环 注意: 1. while循环是一种入口条件循环; **while循环实现延时** ```cpp #include #include int main() { using namespace std; cout << "Enter the delay time, in seconds: "; float secs; cin >> secs; clock_t delay = secs * CLOCKS_PER_SEC; cout << "staring\a\n"; clock_t start = clock(); while (clock() - start < delay) ; cout << "done \a\n"; cin.get(); cin.get(); return 0; } ``` **类型别名** ```cpp // 使用预处理器 #define BYTE char // 使用关键字typedef(推荐,可用于声明一系列变量) typedef char byte; typedef char * byte_pointer; // pointer to char type ``` ## 5.3 do while循环 注意: 1. do while循环是一种出口条件循环; 2. 适合必须先获得输入才能进行测试的情况; ```cpp int n; do { cin >> n; } while (n != 7); ``` ## 5.4 基于范围的for循环(C++11) ```cpp double prices[5] = {4.99, 10.99, 2.32}; for (double x : prices) cout << x << std::endl; // &表明x是一个引用变量,这种声明让接下来的代码能够修改数组的内容 for (double &x : prices) x = x * 0.80; ``` ## 5.5 循环和文本输入 注意: 1. 原始cin忽略空格和换行符; 2. cin.get(char)可以读取空格; ```cpp // 使用原始cin,忽略空格和换行符 char ch; int count = 0; cout << "Enter characters; enter # to quit:\n"; cin.get(ch); while (ch != '#') { cout << ch; ++count; cin.get(ch); } cout << endl << count << "characters read\n"; return 0; // cin.fail()检测文件尾条件(EOF) // while(!cin.fail()) <=> while(cin) <=> while(cin.get(ch)) // cin.get(char)的返回值为cin // 下面两程序等价 char ch; cin.get(ch); // EOF可能与char类型不兼容 while (cin.fail() == false) { cout << ch; ++count; cin.get(ch); } int ch; ch = cin.get(); while (ch != EOF) { cout.put(ch); ++count; ch = cin.get(); } int ch; while((ch = cin.get()) != EOF) { cout.put(char(ch)); ++count; } ``` 小知识点: 如果留心,会发现cin.get()有好多种,比如`cin.get(); cin.get(ch); cin.get(name, ArSize);`为什么名字一样,但是可以传入不同的参数呢?这是因为函数重载,它允许创建多个同名函数,条件是它们的参数列表不同。 ## 5.6 嵌套循环和二维数组 C++没有提供二维数组类型,但用户可以创建每个元素本身都是数组的数组 **二维数组** ```cpp int btus[5] = {23, 26, 24, 31, 28}; int maxtemps[4][5] = { {96, 100, 87, 101, 105}, {2, 3, 4, 5, 7}, {4, 4, 6, 7, 9}, {45, 345, 234, 21, 321} }; const char * cities[3] = { "Nanjing", "Beijing", "lianyungang" }; ``` 赞赏 微信支付 支付宝支付