使用赋值作为条件表达式?

考虑:

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) { ... }