逗号运算符和赋值

时间:2017-10-10 15:08:32

标签: c++ operators comma comma-operator

考虑声明:

.atom/

我咨询了this网站。现在发生这种情况是因为int a; a = 1,2,3; cout<<a; // prints a = 1 运算符的优先级最低。所以它就像comma。但出于好奇,我想知道在此之后发生了什么,编译器是否忘记了剩余的数字(a=1),2,32。因为我认为如果他们被考虑那么可能先是1然后是2然后3会被初始化为3(类似于a)。请告诉我这里究竟发生了什么?

4 个答案:

答案 0 :(得分:8)

此:

a = 1,2,3;

相当于:

a = 1;
2;
3;

因此,23将被评估,但无效

您可以使用g++ main.cpp -Wall -Wextra进行编译,并让编译器警告您:

warning: right operand of comma operator has no effect [-Wunused-value]
     a = 1,2,3;
             ^
warning: right operand of comma operator has no effect [-Wunused-value]
     a = 1,2,3;
              ^

答案 1 :(得分:3)

a = 1,2,3是一个等于3的表达式,其副作用是将{1}分配给a

也就是说,你可以写

int b = (a = 1, 2, 3);

b的值为3,a为1。

2 从不的评估有效。您是否拒绝了编译器警告?

答案 2 :(得分:0)

来自C标准(6.5.17逗号操作员)

  

2逗号运算符的左操作数被计算为void   表达;它的评估与之间存在一个序列点   正确的操作数。然后评估右操作数;结果   有它的类型和价值

通常这个表达式语句

a = 1,2,3;

看起来像

( a = 1 ), ( 2 ), ( 3 );

(更像是( ( a = 1 ), ( 2 ) ), ( 3 ),表达式包含两个逗号运算符)

由于未使用表达式( 2 )( 3 )的评估结果,编译器可以从生成的对象代码中删除它们。只有表达式( a = 1)具有更改变量a的副作用。

所以编译器可以像

一样考虑这个语句
a = 1;

另一方面,如果要考虑声明

int a = ( 1,2,3 );

然后这里初始化器是一个带有(两个)逗号运算符的表达式。所以声明等同于

int a = ( ( 1 ), ( 2 ), ( 3 ) );

由于表达式( 1 )( 2 )被评估为void表达式并且没有副作用,编译器可以从生成的对象代码中删除它们并考虑声明如

int a = 3;

答案 3 :(得分:0)

当你这样做时

#include<iostream>
int main()
{
    int a;
    a=1,2,3;
}

Full compiler log 编译器只会执行

     mov dword ptr [rbp - 4], 1 

将忽略2和3以及gsamaras提到的警告