我刚刚遇到这样的代码:
int a = (1, 2, 3);
我以前从未见过这个符号。这是什么意思?
这是逗号运算符:先求a, b
的值,然后求a
的值,然后求b
的值,结果是b
的值。
int a = (1, 2, 3);
首先计算1
,然后计算2
,最后计算3
,并使用最后的3
初始化a
。它在这里是无用的,但是当,
的左操作数有副作用时(通常:当它是一个函数调用时),它可能是有用的。
它使用逗号操作符,它只是按顺序计算每个操作数表达式(在中间引入适当的序列点)并返回最后一个。因此,您的示例实际上相当于int a = 3;
。
但它确实是C和 c++ 中使用最少的操作符之一,不要与函数调用表达式、初始化列表和所有其他地方使用的逗号混淆。一个不那么罕见的用例是在for循环中进行多次递增(for(...; ...; ++i,++j)
),尽管您可能从未想过实际上使用所谓的逗号操作符。
另一个有趣的用例是,为了清晰和简洁,试图将多个概念相关的表达式放入单个语句中(如return),就像旧的frexp
的实现一样,它有奇怪的指针返回参数(忽略正常的c++只会返回一对的事实):
double frexp(double arg, int *exp)
{
if(...)
return *exp=..., result;
...
}
比等效的
更精简double frexp(double arg, int *exp)
{
if(...)
{
*exp = ...;
return result;
}
...
}
Wiki:逗号操作符
i = (a, b, c); // stores c into i
为逗号操作符。C11标准讲述了这种操作符的一个用例。
C11标准6:5:17
逗号算子
逗号操作符的左操作数被计算为空的表情;在它的求值和它之间有一个序列点右操作数的。然后对右操作数求值;结果有它的类型和值。114)
逗号操作符(如所述)在本小节中,不能在使用逗号的上下文中出现分隔列表中的项(如函数的参数或的列表)初始化)。另一方面,可以在带括号的表达式或在a的第二个表达式内条件运算符。在函数中调用f(a, (t=3)T +2), c)函数有三个参数,第二个参数有值5。
这是逗号操作符。它"包装"多个表达式,从左到右求值,整个表达式的值由最后一个子表达式确定。在您的示例中,它的计算结果为3
。
逗号操作符特别方便的一种情况是,如果您想在for循环"增量"表达式中执行多项操作,例如增加两个变量。
示例:使用x
和y
作为单独的变量,沿着对角线迭代图像。我对x
和y
使用了两个单独的变量,因为我可能想要在循环中独立地改变其中一个(记住,这只是一个愚蠢的例子)。因此,我想在for循环的"increment"语句中增加x
和y
:
for(int x = 0, y = 0; x < width && y < height; ++x, ++y) {
// ... ^^^^^^^^
}
注意for循环的"initialization"表达式没有使用逗号操作符;它只是声明了两个变量
它只计算1、2和3(因为它们只是值,但也可以是函数调用),并将最后一个的值(或返回值)设置为左操作数(在您的示例中为a)。
也许这将帮助你理解它是如何工作的:
#include <stdio.h>
int toto()
{
printf("toto()n");
return (21);
}
int tata()
{
printf("tata()n");
return (42);
}
int main()
{
int a = (toto(), tata());
printf("%dn", a);
return (0);
}
输出:toto()
tata()
42
编辑:这是C代码,在c++中也是一样的