使用赋值作为条件表达式
Using assignment as a condition expression?
考虑:
if (a=5) {
/* do something */
}
作业如何作为条件工作?
它是否基于 l 值的非零值?
C++ — ISO/IEC 14882:2003(E(
[5.17/1]
有几个赋值运算符,所有这些运算符都包含组 从右到左。所有这些都需要一个可修改的左操作数作为它们的左操作数, 赋值表达式的类型是其左操作数的类型。 赋值操作的结果是存储在左侧的值 分配发生后的操作数;结果是一个左值。
表达式 a = 5
的结果是 5
。
[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 = 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
}
每个非零值都将被视为 true。
所以有些人会建议你写
5 == a
为了避免你犯错误 == by =。
if(a=x)
等效于if(x)
除了分配了x
a
.因此,如果表达式x
计算结果为非零值,则if(x)
只是变为if(true)
。否则,它变得if(false)
.
在您的情况下,由于x = 5
,这意味着除了分配了5
之外,f(a=5)
等效于 if(true)
a
。
是的,它基于 a 分配的零/非零值。对于某些人(包括我自己(来说,在代码中使用带有副作用的表达式也被认为是不好的做法,因此提到的代码片段最好写成类似的东西
a = 5;
...
if (a != 0) {
...
}
在更现代的用法中,您有时可能会看到此模式用于处理optional
:
std::optional x = ...;
if (auto v = x) {
// Block only executes if x contained a value, accessible as *v
}
- 优化/减少 if 语句中的条件表达式
- 实现基于数字值(正、负、零)的条件表达式的最佳方法
- 如何使用条件表达式返回对象指针?
- 如何将特征张量的值作为'if'条件表达式
- 对条件表达式结果的赋值(其中第二个和第三个操作数是相同类型和值类别的变量)是否仍然存在?
- 类简单分数的不可接受的条件表达式
- 如何在条件表达式中使用 'cin' 正确退出 while 循环?(C++,CLion)
- 条件表达式解析新表达式中详细阐述的类型说明符时出错
- 是“警告 C4127”(条件表达式是常量)曾经有帮助
- 是条件表达式C++总是布尔类型
- LAMBDA 错误:类型 'void' 的条件表达式是非法的
- 条件表达式中的右值引用
- 条件表达式中的C++sizeof(typename T)
- 条件表达式中的模
- C4127:条件表达式为常量
- C++中的Where是使用条件表达式所必需的(?:)
- 将数组用作c++中有效的条件表达式
- 条件表达式行为不正确
- c++条件语句是否带有从条件表达式到语句的依赖关系?
- c++ 11对std::greater和std::less的条件表达式得到了不同类型的错误