为什么C++中for循环的i=a赋值条件能让代码正常运行?
关于C++中赋值表达式作为for循环条件的问题解答
核心运行逻辑
你看到的i = a作为for循环条件是完全合法的C++语法,它能正常触发循环终止的原因如下:
- C++的for循环第二个位置只要是可转换为布尔类型的表达式就合法,不要求必须是
==/<这类比较表达式 i = a是赋值表达式,它的返回值等于赋值完成后左操作数i的实际值- C++中整数类型转布尔的规则为:非0值转换为
true,0转换为false
具体执行流程(以输入3333为例)
- 调用
DigitCountSum时形参a初始值为3333 - 进入for循环首先执行初始化
int i = 1 - 执行循环条件
i = a:- 当
a不为0时,赋值后i等于a的非0值,表达式返回true,进入循环体 - 循环体中每次将
a的末位累加到s后,把a除以10去掉末位 - 直到
a被除到0时,执行i = a会把i赋值为0,表达式返回false,循环终止
- 当
- 注意:这里的
i++完全没有实际作用,每次循环判断时i都会被重新赋值为a,之前的自增结果会被直接覆盖,属于冗余代码。
写法说明
这种把赋值表达式直接写在循环条件里的写法可读性极差,属于非常不推荐的编码风格,绝大多数编译器遇到这种写法都会抛出警告,提醒你可能是把相等判断i == a误写成了赋值i = a。实际开发中如果要实现相同的逐位求和逻辑,推荐写为更清晰的版本:
int DigitCountSum(int a) { int s = 0; while(a != 0) { s += a % 10; a /= 10; } return s; }
内容的提问来源于stack exchange,提问作者Er_0
相关产品推荐
相关产品推荐

