#include<stdio.h>
int main()
{
int x=10,y=12;
printf("%d",(x,y));
return 0;
}
该程序的输出是12.如何?
答案 0 :(得分:4)
您偶然使用comma operator。
在C和C ++编程语言中,逗号运算符(由标记,
表示)是一个二元运算符,用于计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回该值(和类型)。
那就是说,
printf("%d",(x,y));
在功能上等同于
printf("%d", y);
答案 1 :(得分:4)
您正在评估的表达式是:
x,y
此表达式使用逗号运算符。标准( 6.5.17逗号运算符)表示:
逗号运算符的左操作数被计算为void表达式;有一个 其评估与右操作数之间的序列点。然后是正确的 操作数被评估;结果有其类型和价值。
因此,在您的代码中,x,y
评估为y
,其值为12
。
有关更广泛的讨论,我建议您cppreference.com。虽然这讨论了C ++,但对此运算符的讨论在C语境中是有效的。特别与您的问题相关的是此部分:
各种以逗号分隔的列表中的逗号,例如函数参数列表(
f(a, b, c)
),初始化列表int a[] = {1,2,3}
或初始化语句(int i, j;
)不是逗号运算符。如果需要在该上下文中使用逗号运算符,则必须使用括号括起来:f(a, (n++, n+b), c)
。
这正是你问题中的情况。如果你写了:
printf("%d", x, y);
然后就不会使用逗号运算符,并且你会向printf
提供一个参数而不是格式说明符。
答案 2 :(得分:0)
这是因为评估了第一个(x,y)
inside()表达式是x,y它们是从左到右计算的,因为Comma
运算符的关联性是left to right
,所以求值(x,y)的最后一个值是y。
阅读operator precedence and associativity rule
以及如何在运算符优先级下计算表达式以理解这些类型的表达式