提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
之前学c++基础语法的时候关于if里面进行相等判断,记得说过把值写在前面,避免把==写成=赋值语句,后来潜意识里面一直认为if里面如果是赋值语句就一定会执行,最近看一份代码时发现了这种情况,发现是自己一直理解错了,做个记录。
一、几种情况
在 C/C++ 中,允许在 if 条件表达式中进行变量初始化(赋值)操作,此时整个表达式的值就是这个变量的值。具体判断规则如下:
-
if(int a = 1):- 先定义变量
a并赋值为 1 - 条件判断的是
a的值(1),非零值在条件判断中视为“真” - 因此会进入 if 分支
- 先定义变量
-
if(int b = 0):- 定义变量
b并赋值为 0 - 条件判断的是
b的值(0),零值在条件判断中视为“假” - 因此不会进入 if 分支
- 定义变量
-
if(int* p = nullptr)(C++11 及以上,C 中用NULL):- 定义指针
p并赋值为空指针 - 空指针在条件判断中被视为“假”(本质上相当于 0)
- 因此不会进入 if 分支
- 定义指针
这种写法在实际开发中偶尔会用到,比如在 if 中初始化文件指针、迭代器等,例如:
if (FILE* f = fopen("file.txt", "r")) {
// 文件打开成功时执行(f非空)
fclose(f);
}
需要注意的是,这种语法只在 C/C++ 中合法,在 Java、Python 等其他语言中不允许在 if 条件中直接定义变量。
二、注意点
在 C/C++ 中,if(b = 0) 这种写法需要特别注意:
这不是判断 b 是否等于 0,而是一个赋值操作——将 0 赋值给变量 b,然后整个表达式的值就是赋值后的结果(即 0)。
由于 0 在条件判断中被视为“假”,因此:
if(b = 0)不会进入 if 分支
这种写法很容易与判断相等的 if(b == 0) 混淆,是常见的编程错误。编译器通常会对此类代码发出警告(提示可能混淆了赋值和相等判断)。
如果确实想在条件中进行赋值并判断(不推荐,可读性差),需要显式添加括号强调意图:
if( (b = 0) != 0 ) { // 此时仍不会进入,因为赋值结果是0
// ...
}
三、关于赋值表达式
在 C/C++ 中,赋值表达式本身是有返回值的,其返回值就是赋值操作完成后“被赋值变量”的值。
对于代码 int a = (b = 0);:
- 先执行括号内的
b = 0:将 0 赋值给b,这个赋值表达式的返回值是 0 - 再将这个返回值(0)赋值给
a
因此,最终结果是:
b的值为 0a的值也为 0
这种嵌套赋值在语法上是合法的,但过度使用会降低代码可读性,实际开发中应谨慎使用。
380

被折叠的 条评论
为什么被折叠?



