for循环
背景
对for循环的系统的整理
for循环
1 | for(初始化; 条件; 迭代) |
注意:
(1)控制for循环的任一表达式或所有表达式都可以省略,但分号必须有。
(2)编译器会忽略for语句中的所有空白。
(3)c++17为if和switch语句的初始化语句引入了一种新的语法。这些初始化语句参考了for循环的初始化语句,所以二者非常类似。
唯一的区别在于,在for循环中省去初始化语句时,不能省去第一个分号。
用浮点数控制for循环
for循环的例子一般是用整型变量来控制循环,但通常还可以使用任意变量来控制循环。
在使用浮点变量来控制for循环时应小心。
小数部分的值可能不能用二进制浮点数准确的表示,这会导致一些意想不到的负面效应。
1 | // Floating-point control in a for loop |
注意:
(1)任何数字,只要其分数部分的分母是奇数,就不能准确的表示为二进制浮点数。
(2)比较浮点数很容易产生问题。
当使用== 、<= 或 >=直接比较浮点运算的结果时,应该十分小心。
舍入错误几乎总是会使浮点数值不能与数学上的精确值完全相等。
(3)大部分数学库和所谓的单元测试框架都提供了实用函数,以可靠的方式来帮助比较浮点数。
更复杂的for循环控制表达式
在for循环控制表达式中可以定义并初始化多个给定类型的变量。各个变量之间用逗号隔开。
1 | unsigned int limit{5}; |
注意:
if和switch语句的可选初始化语句与for循环的初始化语句完全对应。所以在if和switch语句的初始化中,也可以同时定义多个变量。
基于范围的for循环
基于范围的for循环迭代一个值范围中的所有值。
范围是什么?
数组是一个元素范围,字符串是一个字符范围。标准库提供的容器都是范围。
标准形式:
1 | for(range_declaration : range_expression) |
如下示例:
1 | int values[] { 1, 2, 3, 4, 5, 6, 7, 8, 9}; |
初始化列表本身是有效的范围。
使用auto关键字会让编译器推断出正确的类型。
auto关键字在基于范围的for循环中很常见。这是迭代数组或其他范围中所有元素的一种非常好的方式。
不需要知道元素的个数,循环机制会自动确定。
1 | int values[] { 1, 2, 3, 4, 5, 6, 7, 8, 9}; |