Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用赋值作为条件表达式?_C++_C_If Statement_Assignment Operator_Evaluation - Fatal编程技术网

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()){
cout
if(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作用域赋值就好了。