使用赋值作为条件表达式

Using assignment as a condition expression?

本文关键字:条件 表达式 赋值      更新时间:2023-10-16

考虑:

if (a=5) {
   /* do something */
}

作业如何作为条件工作?

它是否基于 l 值的非零值?

C++ — ISO/IEC 14882:2003(E(

[5.17/1] 有几个赋值运算符,所有这些运算符都包含组 从右到左。所有这些都需要一个可修改的左操作数作为它们的左操作数, 赋值表达式的类型是其左操作数的类型。 赋值操作的结果是存储在左侧的值 分配发生后的操作数;结果是一个左值。

表达式 a = 5 的结果是 5

[6.4/4] [..]作为表达式的条件的值是 表达式,隐式转换为 bool 以外的语句 switch .[..]

转换为bool

[4.12/1] 算术、枚举、指针或指向成员的指针的右值 类型可以转换为类型 bool 的右值。零值,空 指针值或空成员指针值转换为false;任何 其他值将转换为true

5转换为布尔true

[6.4.1/1] 如果条件 (6.4( 产生第一个 执行子语句。[..]

true被视为if语句成功。


C — ISO/IEC 9899:1999(E(

[6.5.16/3]赋值运算符在对象中存储值 由左操作数指定。赋值表达式具有值 赋值后的左操作数,但不是左键。[..]

表达式 a = 5 的结果是 5

[6.8.4.1/2] 在这两种形式中,如果 表达式比较不等于 0。[..]

5被视为if语句成功。


常规

像这样的代码几乎总是一个错误;作者可能打算if (a == 5) {}。但是,有时它是故意的。您可能会看到如下代码:

if (x = foo()) {
   cout << "I set x to the result of foo(), which is truthy";
   // ... stuff
}

每个非零值都将被视为 true

所以有些人会建议你写

5 == a

为了避免你犯错误 == by =

if(a=x) 等效于if(x) 除了分配了x a .因此,如果表达式x计算结果为非零值,则if(x)只是变为if(true)。否则,它变得if(false).

在您的情况下,由于x = 5,这意味着除了分配了5之外,f(a=5) 等效于 if(true) a

是的,它基于 a 分配的零/非零值。对于某些人(包括我自己(来说,在代码中使用带有副作用的表达式也被认为是不好的做法,因此提到的代码片段最好写成类似的东西

a = 5;
...
if (a != 0) {
    ...
}

在更现代的用法中,您有时可能会看到此模式用于处理optional

std::optional x = ...;
if (auto v = x) {
  // Block only executes if x contained a value, accessible as *v
}