考虑:
if (a=5) {
/* do something */
}
作业如何作为条件?
它是基于l值的非零值吗?
答案 0 :(得分:22)
[5.17/1]
有几个赋值运算符,所有这些都是分组 右到左。所有都需要一个可修改的左值作为左操作数, 赋值表达式的类型是其左操作数的类型。 赋值操作的结果是存储在左侧的值 任务完成后的操作数;结果是一个左值。
表达式a = 5
的结果是5
。
[6.4/4]
[..]作为表达式的条件的值是 表达式,隐式转换为bool
以用于除。之外的语句switch
。 [..]
转换为bool
。
[4.12/1]
算术,枚举,指针或指向成员的指针的右值 type可以转换为bool
类型的右值。零值,null 指针值,或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
}
答案 1 :(得分:1)
if(a=x)
分配if(x)
之外, a
相当于x
。因此,如果表达式x
计算为非零值,则if(x)
只会变为if(true)
。否则,它变为if(false)
。
在您的情况下,自x = 5
起,这意味着f(a=5)
除了if(true)
以及a
分配外,还相当于5
。
答案 2 :(得分:1)
每个非零值都将被视为 true 。
所以有些人会建议你写
5 == a
避免您通过 = 错误 == 。
答案 3 :(得分:0)
是的,它基于分配了a的零/非零值。对于某些人(包括我自己)来说,在代码中使用带有副作用的表达式也被认为是不好的做法,因此所提到的代码片段最好写成类似的东西
a = 5;
...
if (a != 0) {
...
}
答案 4 :(得分:0)
在更现代的用法中,有时您可能会看到此模式用于处理optional
:
std::optional x = ...;
if (auto v = x) {
// Block only executes if x contained a value, accessible as *v
}