逗号运算符的优先级

时间:2016-01-28 16:23:11

标签: c

#include<stdio.h>
void main(){
  int a,b;
  a=3,1;
  b=(5,4);
  printf("%d",a+b);
} 

我是C的新手并且无法理解上述计划。任何人都可以解释一下程序输出吗?

3 个答案:

答案 0 :(得分:6)

comma operator按顺序评估每个子表达式,丢弃除最右边的子表达式之外的所有子表达式的值,并评估最右边的子表达式。

此运算符具有最低优先级,实际上低于赋值运算符。所以这个:

a=3,1;

相当于:

(a=3),1;

因此为a分配值3,然后评估值1。完整表达式的值为1,但该值将被丢弃,因为它未分配给任何内容。

相反:

b=(5,4);

括号使逗号运算符首先进行求值。因此评估并放弃5,然后评估4并将其分配给b

因此a的值为3,b的值为4.因此程序会打印a+b 7

答案 1 :(得分:3)

此表达式声明

  a=3,1;

包含两个运算符。第一个是赋值运算符a = 3,它将3分配给a,第二个运算符是逗号运算符。你可以想象它 ( a = 3 ), 1。也就是说它有两个表达式为( a = 3 )1的操作数。第二个表达式是整数文字1的值,它没有效果。

考虑到赋值运算符的优先级高于逗号运算符。

在此表达式声明中

  b=(5,4);

也有相同的两个运算符:赋值运算符和逗号运算符。但现在逗号运算符括在括号中。逗号运算符的值是其第二个操作数的值。因此,使用逗号运算符( 5, 4 )的表达式会产生4。此值已分配给b

最后你有

printf("%d",a+b);

输出等于3 + 4 = 7的ab之和。

答案 2 :(得分:1)

如果使用-Wall选项编译它,编译器会发出警告:

test.c: In function ‘main’:
test.c:159:6: warning: right-hand operand of comma expression has no effect [-Wunused-value]
   a=3,1;
      ^
test.c:160:7: warning: left-hand operand of comma expression has no effect [-Wunused-value]
   b=(5,4);
       ^

这可以解释您将哪个值作为ab变量的初始值。

在这种情况下a=3 b=4