运算符 ',' 是否总是返回第二个参数?
Does operator ',' always returns the second argument?
在GCC
#include <iostream>
int main() {
if(1 == 2, true) {
std::cout << "right" << std::endl;
} else std::cout << "left" << std::endl;
return 0;
}
它输出'right',它总是这样吗?
编译器可以优化出左操作数,因为它没有使用?
warning: left operand of comma operator has no effect [-Wunused-value]
if(1 == 2, true) {
~~^~~~
我有一些像这样的代码:
if(doSomethingHereWhichAlwaysReturnsTrue,
doSomeOtherHereAndDependOnTheResultExecuteBodyOrNot) {
..body.. - execute if 'doSomeOther' returns true
}
通过这段代码是调试的,我想知道我可以在发布中使用这样的结构。我猜没有。
不问两次,我有时也使用分配链,如:
int i, j, k, l;
i = j = k = l = 0;
安全吗?
我曾经听说执行顺序是未定义的,所以这是一个未定义的行为。作为UB,它可以被编译器清楚地优化出来,但使用'-O3 -Wall -pedantic',我看到没有警告,和预期的结果,所以我猜这里有没有问题。
c++标准5.18规定
用逗号分隔的一对表达式从左到右求值;左边的表达式是一个discardedvalue表达式(第5条)每一个与左表达式相关的值计算和副作用在每个值计算和副作用关联之前进行排序用正确的表达。结果的类型和值为右操作数的类型和值;结果是相同的值类别作为其右操作数,如果其为右操作数,则为位域是一个全局值和位域。如果右操作数的值为a临时的(12.2),结果是临时的。
所以,是的,根据标准,返回第二个操作数的值是预期的行为。
但是,您可以重载逗号操作符,在这种情况下,它可以返回您想要的任何内容。
不完全是。对于int double等基本类型,它是正确的。而对于类,可以覆盖,操作符并决定操作符返回什么。在boost库中有一个很好的例子,该函数是关于插入向量的。
相关文章:
- 如果条件,当我想第二个参数时
- 如何从第一个参数推断第二个参数类型?
- C++ std::enable_if - 第二个参数的功能
- 如何成功地将函数对象(或lambda)传递给trackbar回调的第二个参数(void*)
- 第二个参数的部分模板专用化
- 难以理解C++中 inet_ntop() 的第二个参数
- 如何传递 ObjectTemplate::New in Google V8 的第二个参数
- 模板的C 功能将第一个参数设置为第二个参数为默认参数
- 我的类中的第二个参数是一个数组.我不确定如何在主程序中编写
- shake_transform_iterator作为推力中的第二个参数的重点是什么:: dredion算法
- 重载运算符:第一个参数对应左操作数,第二个参数对应右操作数
- 递归可变参数模板函数调用第二个参数类型的指针"loses"指针
- 无法转换初始值设定项列表的第二个参数
- 当 cin.getline() 的第二个参数大于数组长度时,不可预测的字符串长度
- 在 QList 派生类的每个迭代器中将'this'作为第二个参数
- std::vector.resize()中的第二个参数是什么意思
- CreateProcess的第二个参数应该是什么
- 此签名中的第二个参数是什么意思
- 是否可以绑定lambda函数的第二个参数
- 第二个参数和第三个参数在fwrite()中的作用是什么?为什么我们在这里需要 3rcount?