C++ 使用赋值作为条件表达式?
考虑:C++ 使用赋值作为条件表达式?,c++,c,if-statement,assignment-operator,evaluation,C++,C,If Statement,Assignment Operator,Evaluation,考虑: if (a=5) { /* do something */ } 作业作为一个条件是如何工作的 是否基于l值的非零值?C++-ISO/IEC 14882:2003(E) [5.17/1]有几个赋值运算符,它们都是 从右到左。都需要一个可修改的左值作为其左操作数, 赋值表达式的类型是其左操作数的类型。 赋值操作的结果是存储在左边的值 赋值后的操作数;结果是左值 表达式a=5的结果是5 [6.4/4][…]作为表达式的条件的值是 表达式,隐式转换为bool,用于除 开关。[……] 转换
if (a=5) {
/* do something */
}
作业作为一个条件是如何工作的
是否基于l值的非零值?C++-ISO/IEC 14882:2003(E)
[5.17/1]
有几个赋值运算符,它们都是
从右到左。都需要一个可修改的左值作为其左操作数,
赋值表达式的类型是其左操作数的类型。
赋值操作的结果是存储在左边的值
赋值后的操作数;结果是左值
表达式a=5
的结果是5
[6.4/4]
[…]作为表达式的条件的值是
表达式,隐式转换为bool
,用于除
开关
。[……]
转换为bool
[4.12/1]
算术、枚举、指针或指向成员的指针的右值
类型可以转换为类型为bool
的右值。零值,空值
指针值或空成员指针值转换为false
任何
其他值转换为true
5
转换为布尔值true
[6.4.1/1]
如果条件(6.4)第一次生成true
执行子语句。[…]
true
被视为if
语句成功
C-ISO/IEC 9899:1999(E)
[6.5.16/3]
赋值运算符在对象中存储值
由左操作数指定赋值表达式具有以下值:
赋值后左操作数的,但不是左值。[……]
表达式a=5
的结果是5
[6.8.4.1/2]
在两种形式中,如果
表达式比较不等于0。[……]
5
被视为if
语句成功
一般的 像这样的代码几乎总是一个错误;作者可能打算
如果(a==5){}
。然而,有时这是故意的。您可能会看到如下代码:
if (x = foo()) {
cout << "I set x to the result of foo(), which is truthy";
// ... stuff
}
if(x=foo()){
coutif(a=x)
与if(x)
除了a
分配了x
。因此,如果表达式x
的计算结果为非零值,那么if(x)
简单地变成if(true)
。否则,它变成if(false)
在您的情况下,由于x=5
,这意味着f(a=5)
与if(true)
等价,除了a
分配了5
之外,每个非零值都将被视为true
所以有些人会建议你写
5 == a
为了避免您因=而犯错误=是的,它是基于分配给a的零/非零值。对于某些人(包括我自己)来说,在代码中使用带有副作用的表达式也被认为是不好的做法,因此所提到的代码片段最好是这样写的
a = 5;
...
if (a != 0) {
...
}
在更现代的用法中,您有时可能会看到此模式用于处理optional
s:
std::可选x=。。。;
如果(自动v=x){
//块仅在x包含值时执行,该值可作为*v访问
}
你在C++还是C?<代码> int Walth= false中编译;如果(WAR=true){SaunnjuKe();} @ WTP:永远不要把布尔值与任何东西进行比较。
而那些将true
或false
赋值给非布尔值的程序员应该受到各种各样的攻击。@David:WTP在哪里把布尔值与布尔值进行了比较?@Tomalak:他没有,但是if(var=true)
可能是if(var==true)
。把它写成if(var)
首先可以巧妙地避免潜在的=
与=
的混淆。为了确保没有错,你可以写如果((a=5)!=0)
,它在语义上与如果(a=5)
相同。0.0
会被认为是零值吗?@Stan:我看像是零!(虽然回忆浮点是不准确的)因为问题是C和C++都是很好的,你可以引用C++,而不是C。这两种推理的方式有很大的不同。@ Toalalk Geel'Kal:字体可能会有点小。这有点误导:<代码>(A=5)< /> >不等于<代码>(如果)
因为它还分配a
-1:if(a=x)”和
if(x)“不是等效的,第一个表达式有副作用。@interjay:我刚刚编辑了这个,当你们发表评论时。现在大多数编译器都会警告这个错误。@Bo Persson:当然是。但是一些懒惰的人想关闭警告,所以让我们把它当作一个错误而不是警告。-1:对我来说,这很难看,不能提供一个警告一般的解决办法。我不建议写5==a
。我建议写a==5
:)就这么做吧;这并不难。如果你关闭警告,那么你得到的一切都是你应得的。@Tomalak Geret'kal:我同意你的看法。所以我说的是“一些人”,而不仅仅是“我”。当然,“5==a”很难看,但是,有些人(比如我的老板)这有助于…有时你不得不放弃。我认为如果是if(inta=foo()){…}…if作用域赋值就好了。