以下代码:
int main(void) {
int x = 1000, y = 5000;
printf ("%d\n", x, y);
printf ("%d\n", (x, y));
return 0;
}
输出: 1000 5000
有人可以解释一下吗?
答案 0 :(得分:2)
关于operator precedence
在(x,y)的情况下,对()内部()的第一个语句进行求值,以便将最后一个值y作为()的结果。 without()所有逗号运算符都具有相同的优先级,因此从左到右进行求值,因此对printf()采用x值
答案 1 :(得分:2)
括号使(x, y)
成为单个表达式,由x
和y
组成comma operator。运算符评估x
,抛出值,评估y
,并使其成为表达式的值。
由于评估变量x
没有副作用,因此在这种情况下,表达式(x, y)
相当于自己传递的y
:
printf ("%d\n", y);
注意:如果您的第一个printf
使用"%d %d"
格式字符串,则会看到x
和y
。
答案 2 :(得分:1)
对于第一个printf,你只是传递一个被忽略的第二个参数。
对于第二个,您正在调用逗号运算符,该运算符计算它的两个参数,并返回第二个值。
答案 3 :(得分:1)
您在这里看到的是C逗号运算符的评估 http://en.wikipedia.org/wiki/Comma_operator
很少使用的逗号运算符通常在for()
循环的第三部分中使用,以便在增量上执行多个操作,但从技术上讲,它在任何地方都是有效的表达式。
答案 4 :(得分:0)
在函数printf的第一次调用中,参数个数超过格式字符串中的格式说明符数
printf ("%d\n", x, y);
在这种情况下,y的第二个参数将被忽略。只有x才会被输出。所以调用的输出是
1000
在函数printf的第二次调用中,只有一个参数是括在括号中的表达式。
printf ("%d\n", (x, y));
此表达式是逗号运算符的表达式。首先评估x的第一个操作数。它的价值被忽略了。然后评估表达式y的第二个操作数。它的值用作完整表达的结果。所以这个函数调用输出
5000