#include<stdio.h>
void main(){
int a,b;
a=3,1;
b=(5,4);
printf("%d",a+b);
}
我是C的新手并且无法理解上述计划。任何人都可以解释一下程序输出吗?
答案 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的a
和b
之和。
答案 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);
^
这可以解释您将哪个值作为a
和b
变量的初始值。
在这种情况下a=3 b=4