c++ - 逗号运算符如何工作

标签 c++ comma-operator

逗号运算符在 C++ 中如何工作?

例如,如果我这样做:

a = b, c;  

a 最终等于 b 还是 c?

(是的,我知道这很容易测试 - 只需在这里记录一下,以便其他人可以快速找到答案。)

更新:这个问题暴露了使用逗号运算符时的细微差别。只是为了记录这一点:

a = b, c;    // a is set to the value of b!

a = (b, c);  // a is set to the value of c!

这个问题实际上是由代码中的拼写错误引起的。本来的目的是什么

a = b;
c = d;

变成了

a = b,    //  <-  Note comma typo!
c = d;

最佳答案

逗号运算符在所有 C/C++ 运算符中具有最低优先级。因此它总是最后一个绑定(bind)到表达式,这意味着:

a = b, c;

相当于:

(a = b), c;

另一个有趣的事实是逗号运算符引入了 sequence point 。这意味着表达式:

a+b, c(), d

保证按顺序计算其三个子表达式(a+bc()d)。如果它们有副作用,这一点就很重要了。通常,编译器可以按照他们认为合适的任何顺序来计算子表达式;例如,在函数调用中:

someFunc(arg1, arg2, arg3)

参数可以按任意顺序求值。请注意,函数调用中的逗号是运算符;它们是分隔符。

关于c++ - 逗号运算符如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60161208/

相关文章:

C++ 逗号运算符重载和引用 vector

c++ - 更改对象并在同一表达式中使用它但子表达式由逗号运算符分隔是否是未定义的行为?

C++,两个没有锁的编写线程

c++ - MFC 应用程序中奇怪的控件显示损坏

C++多线程中断

c++ - cout 是否需要以分号结尾?

c++ - 使用 FILE* 或 std::ifstream 读取文件会更快吗?

c++ - 创建显式专用模板类对象会产生 "object has initializer but incomplete type"错误

c++ - for 语句头的 init-statement 中不允许使用逗号运算符的表达式

javascript - return void 0 === i && (i = 3), 0 === i 是什么意思? ( ..A.. ) : ( . .B.. ) 呢?