在C中,为什么包含逗号(,)运算符的表达式(Statement)的工作方式不同

sky*_*ion 7 c operators comma operator-keyword

我有一个简单的C代码和关于包含逗号(,)运算符的表达式的大混乱.

int main(){
    int i=0,j=11,c;
    c=i=j,++i;
    printf("c=%d i=%d\n",c,i);
    c=(i=j,++i);
    printf("c=%d i=%d\n",c,i);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码打印:

c=11 i=12
c=12 i=12
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 逗号(,)作为运算符的实际工作是什么?
  2. ++比更优先,=,为什么评价为表达做了左逗号?
  3. 如果表达式包含具有不同优先级的运算符,它将依赖于逗号(,)?
  4. 它表现得像分号的替代品(;)?

Vla*_*cow 10

赋值运算符的优先级高于逗号运算符.因此表达

c = i = j, ++i;
Run Code Online (Sandbox Code Playgroud)

相当于

( c = i = j ), ++i;
Run Code Online (Sandbox Code Playgroud)

根据C标准(6.5.17逗号运营商)

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

在上面的表达式中,逗号运算符的结果被丢弃,但它具有增加的副作用i.

在这个表达中

c = ( i = j, ++i );
Run Code Online (Sandbox Code Playgroud)

由于使用括号,您更改了上述表达式的评估顺序.现在它相当于

c = ( ( i = j ), ++i );
Run Code Online (Sandbox Code Playgroud)

和变量根据上面列出的C标准的引用c获取表达式的值++i.