考虑:
if (a=5) {
/* do something */
}
分配如何作为条件工作?
是否基于L值的非零值?
[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
语句成功。
[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
为了避免您通过==>犯错==。
if(a=x)
等同于if(x)
,除了分配给a
的x
。因此,如果表达式x
的计算结果为非零值,则if(x)
仅变为if(true)
。否则,它将变为if(false)
。
是,它基于分配给a的零/非零值。对于某些人(包括我自己),在代码中包含带有副作用的表达式也被认为是不好的做法,因此,所提到的代码片段最好写成类似
在更现代的用法中,您有时可能会看到此模式用于处理optional
: