将赋值用作条件表达式吗?

问题描述 投票:7回答:5

考虑:

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

分配如何作为条件工作?

是否基于L值的非零值?

c++ c if-statement assignment-operator evaluation
5个回答
23
投票

C ++-ISO / IEC 14882:2003(E)

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

表达式a = 5的结果是5

[6.4/4] [..]作为表达式的condition的值是 表达式,隐式转换为bool用于除 switch。 [..]

发生到bool的转换。

[4.12/1]算术,枚举,指针或成员指针的右值 可以将type转换为bool类型的右值。零值,null 指针值,或空成员指针值被转换为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
}

1
投票

每个非零值将被视为true

所以有人会建议你写

5 == a

为了避免您通过==>犯错==


1
投票

if(a=x)等同于if(x),除了分配给ax。因此,如果表达式x的计算结果为非零值,则if(x)仅变为if(true)。否则,它将变为if(false)


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.