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

Geo*_*Joy 5 c c++

考虑:

if (a=5) {
   /* do something */
}
Run Code Online (Sandbox Code Playgroud)

作业如何作为一个条件?

它是基于l值的非零值吗?

Lig*_*ica 22

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

[5.17/1]有几个赋值运算符,所有赋值运算符都从右到左分组.所有都需要一个可修改的左值作为左操作数,赋值表达式的类型是其左操作数的类型. 赋值操作的结果是赋值发生后存储在左操作数中的值 ; 结果是一个左值.

表达的结果a = 55.

[6.4/4][..] 作为表达式的条件的值是表达式的值,隐式转换bool为除以外的语句 switch.[..]

转换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 = 55.

[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
}
Run Code Online (Sandbox Code Playgroud)

  • 为了确保它没有错,你可以编写`if((a = 5)!= 0)`,它在语义上与`if(a = 5)`相同. (2认同)
  • @Als:挑剔多少?:P (2认同)