逗号分隔的值列表用括号括起来是什么意思? a =(1,2,3);

我刚刚遇到基本上执行以下操作的代码:

int a = (1, 2, 3); 

我以前从未见过这种表示法。 这是什么意思?

这是逗号运算符 : a, b首先导致a被评估,然后是b ,结果是b的结果。

int a = (1, 2, 3); 首先评估1 ,然后评估2 ,最后评估3 ,并使用最后3来初始化a 。 它在这里没用,但是当左操作数有副作用时(通常:当它是一个函数调用时)它会很有用。

它使用逗号运算符 ,它只是顺序地计算每个操作数表达式(在它们之间引入适当的序列点)并返回最后一个。 因此,您的示例实际上等效于int a = 3;

但它确实是CC ++中使用最少的运算符之一,不要与函数调用表达式,初始化列表和所有其他地方使用的逗号混淆。 一个不那么罕见的用例是for循环中的多个增量( for(...; ...; ++i,++j) ),即使您可能从未想过这实际上使用了所谓的逗号运营商。

另一个有趣的用例是当试图将多个概念上相关的表达式放入单个语句(如返回)时,为了清晰和简洁,就像在旧的frexp及其奇怪的指针返回参数的实现中一样(忽略这个事实,正确的C ++只返回一对):

 double frexp(double arg, int *exp) { if(...) return *exp=..., result; ... } 

这比同等版本更精简

 double frexp(double arg, int *exp) { if(...) { *exp = ...; return result; } ... } 

维基: 逗号运营商

 i = (a, b, c); // stores c into i 

它是逗号运算符。 C11标准讲述了这种运算符的一个用例。

C11 标准 6:5:17

逗号运算符

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

逗号运算符(如本子条款中所述)不能出现在使用逗号分隔列表中的项目的上下文中(例如函数的参数或初始化程序列表)。 另一方面, 它可以在括号内表达式中使用也可以在这种上下文中的条件运算符的第二表达式中使用。 在函数调用f(a,(t = 3,t + 2),c)中,函数有三个参数,第二个参数的值为5。

这是逗号运算符 。 它“包装”多个表达式,从左到右计算它们,整个表达式的值由最后一个子表达式确定。 在您的示例中,它的计算结果为3

逗号运算符特别方便的情况是,如果要在for循环“增量”表达式中执行多项操作,例如增加两个变量。

示例:使用xy作为单独的变量沿对角线迭代图像。 我为xy使用两个单独的变量,因为我可能想要在循环中独立地改变其中一个变量(记住,这只是一个愚蠢的例子)。 所以我想在for循环的“increment”语句中增加xy

 for(int x = 0, y = 0; x < width && y < height; ++x, ++y) { // ... ^^^^^^^^ } 

请注意,for循环的“初始化”表达式使用逗号运算符; 它只是声明了两个变量。

它只计算1,2和3(因为它们只是值,但也可以是函数调用),并将最后一个的值(或返回值)设置为左操作数(在您的示例中为a)。

也许这会帮助您了解它的工作原理:

 #include  int toto() { printf("toto()\n"); return (21); } int tata() { printf("tata()\n"); return (42); } int main() { int a = (toto(), tata()); printf("%d\n", a); return (0); } 

输出:

 toto() tata() 42 

编辑:Tha的C代码,在C ++中的工作方式相同