逗号分隔的值列表用括号括起来在C中表示什么?a =(1,2,3);

Amr*_*hit 19 c c++ comma

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

int a = (1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

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

小智 37

这是逗号运算符:评估要评估的a, b第一个原因a,然后b结果是b.

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

  • @leemes在标准C和C++中无效,但是一些编译器(至少是GCC)接受它作为允许使用语句的扩展,而不仅仅是表达式,因此你可以做`({if(0) {1;} 2;})`. (2认同)

Chr*_*ica 19

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

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

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

double frexp(double arg, int *exp)
{
    if(...)
        return *exp=..., result;
    ...
}
Run Code Online (Sandbox Code Playgroud)

这比同等版本更精简

double frexp(double arg, int *exp)
{
    if(...)
    {
        *exp = ...;
        return result;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,我喜欢这个答案比目前最受欢迎的人更喜欢这个答案,但是我可以和互联网争论谁呢?`:)` (4认同)

nur*_*tin 7

维基:逗号运营商

i = (a, b, c);          // stores c into i
Run Code Online (Sandbox Code Playgroud)


Kri*_*dra 5

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

C11 标准 6:5:17

逗号运算符

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

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