if 条件表达式中进行赋值操作

部署运行你感兴趣的模型镜像

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

之前学c++基础语法的时候关于if里面进行相等判断,记得说过把值写在前面,避免把==写成=赋值语句,后来潜意识里面一直认为if里面如果是赋值语句就一定会执行,最近看一份代码时发现了这种情况,发现是自己一直理解错了,做个记录。


一、几种情况

在 C/C++ 中,允许在 if 条件表达式中进行变量初始化(赋值)操作,此时整个表达式的值就是这个变量的值。具体判断规则如下:

  1. if(int a = 1)

    • 先定义变量 a 并赋值为 1
    • 条件判断的是 a 的值(1),非零值在条件判断中视为“真”
    • 因此会进入 if 分支
  2. if(int b = 0)

    • 定义变量 b 并赋值为 0
    • 条件判断的是 b 的值(0),零值在条件判断中视为“假”
    • 因此不会进入 if 分支
  3. 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);

  1. 先执行括号内的 b = 0:将 0 赋值给 b,这个赋值表达式的返回值是 0
  2. 再将这个返回值(0)赋值给 a

因此,最终结果是:

  • b 的值为 0
  • a 的值也为 0

这种嵌套赋值在语法上是合法的,但过度使用会降低代码可读性,实际开发中应谨慎使用。


您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值