在C语言中,用逗号分隔的值列表(用括号括起来)是什么意思?A = (1,2,3);

What does a comma separated list of values, enclosed in parenthesis mean in C? a = (1, 2, 3);

本文关键字:意思 是什么 分隔 列表 起来 语言      更新时间:2023-10-16

我刚刚遇到这样的代码:

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循环"增量"表达式中执行多项操作,例如增加两个变量。

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

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++中也是一样的