Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 逗号运算符与赋值_C++_Operators_Comma_Comma Operator - Fatal编程技术网

C++ 逗号运算符与赋值

C++ 逗号运算符与赋值,c++,operators,comma,comma-operator,C++,Operators,Comma,Comma Operator,考虑以下陈述: int a; a = 1,2,3; cout<<a; // prints a = 1 我查阅了网站。现在发生这种情况是因为逗号运算符的优先级最低。所以它就像a=1,2,3。但是出于好奇,我想知道在这之后会发生什么,编译器会忘记剩下的数字2和3吗。因为我认为如果考虑它们,那么可能首先是1,然后是2,然后是3,将被初始化为类似于a=1,2,3的值。请告诉我这里到底发生了什么?这个: a = 1,2,3; 相当于: a = 1; 2; 3; 因此,将对2和3进行评估

考虑以下陈述:

int a;
a = 1,2,3; 
cout<<a; // prints a = 1
我查阅了网站。现在发生这种情况是因为逗号运算符的优先级最低。所以它就像a=1,2,3。但是出于好奇,我想知道在这之后会发生什么,编译器会忘记剩下的数字2和3吗。因为我认为如果考虑它们,那么可能首先是1,然后是2,然后是3,将被初始化为类似于a=1,2,3的值。请告诉我这里到底发生了什么?

这个:

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;
              ^

来自C标准6.5.17逗号运算符

2逗号运算符的左操作数计算为空 表示在它的评估和那个之间有一个序列点 右操作数的。然后计算右操作数;结果 有它的类型和价值

所以一般来说,这个表达式语句

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被评估为空洞表达式并且没有副作用,编译器可以从生成的目标代码中删除它们,并考虑类似于

的声明。
int a = 3;
a=1,2,3是一个等于3的表达式,其副作用是将1赋值给a

也就是说,你可以写

int b = (a = 1, 2, 3);
b的值为3,a的值为1

对2的评估从来没有效果。您是否已关闭编译器警告?

当您关闭时

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

当编译器遇到表达式2和3时,它将忽略2和3以及gsamaras提到的警告,就像您刚刚编写了2一样;它本身。也就是说,它不会做任何事情。在这种情况下,a=1,2,3;等于a=1;2.3.2.三,;没有效果。在你有2和3的地方的表达式将被计算,这可能有副作用。哦!我输入墙旗不是为了看到警告,这些警告本身就是对我问题的回答!现在我100%清楚了。谢谢@米拉杰:好吧,你早就知道我不知道的事情了:,所以我很佩服你,很高兴我帮了你!:我知道这样的评论是不受欢迎的,但我爱这个社区!!
     mov dword ptr [rbp - 4], 1