使用赋值作为条件表达式?
考虑:
if (a=5) { /* do something */ }
作业如何作为一个条件?
它是基于l值的非零值吗?
C ++ – ISO / IEC 14882:2003(E)
[5.17/1]
有几个赋值运算符,所有赋值运算符都是从右到左分组的。 所有都需要一个可修改的左值作为左操作数,赋值表达式的类型是其左操作数的类型。 赋值操作的结果是赋值发生后存储在左操作数中的值 ; 结果是一个左值。
表达式a = 5
的结果是5
。
[6.4/4]
[..]作为表达式的条件的值是表达式的值,对于除switch
之外的语句, 隐式转换为bool
。 [..]
转换为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]
在两种forms中, 如果表达式将[6.8.4.1/2]
等于0,则执行第一[6.8.4.1/2]
语句 。 [..]
5
被视为if
语句成功。
一般
像这样的代码几乎总是一个错误; if (a == 5) {}
,作者可能会打算。 但是,有时它是故意的。 你可能会看到这样的代码:
if (x = foo()) { cout << "I set x to the result of foo(), which is truthy"; // ... stuff }
每个非零值都将被视为真 。
所以有些人会建议你写
5 == a
避免你犯错误== by = 。
除了赋值为x
之外, if(a=x)
等于if(x)
。 因此,如果表达式x
求值为非零值,则if(x)
将变为if(true)
。 否则,它变为if(false)
。
在你的情况下,因为x = 5
,这意味着除了指定为5
之外, f(a=5)
等于if(true)
。
是的,它基于分配的零/非零值。 对于某些人(包括我自己)来说,在代码中使用带有副作用的表达式也被认为是不好的做法,因此所提到的代码片段最好写成类似的东西。
a = 5; ... if (a != 0) { ... }