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

时间:2011-07-24 14:28:43

标签: c++ c

考虑:

if (a=5) {
   /* do something */
}

作业如何作为条件?

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

5 个答案:

答案 0 :(得分:22)

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

  

[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声明成功。


C - ISO / IEC 9899:1999(E)

  

[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
}