考虑声明:
.atom/
我咨询了this网站。现在发生这种情况是因为int a;
a = 1,2,3;
cout<<a; // prints a = 1
运算符的优先级最低。所以它就像comma
。但出于好奇,我想知道在此之后发生了什么,编译器是否忘记了剩余的数字(a=1),2,3
和2
。因为我认为如果他们被考虑那么可能先是1然后是2然后3会被初始化为3
(类似于a
)。请告诉我这里究竟发生了什么?
答案 0 :(得分:8)
此:
a = 1,2,3;
相当于:
a = 1;
2;
3;
因此,2
和3
将被评估,但无效。
您可以使用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提到的警告