我正在运行一段代码片段。但是我无法理解代码和它所产生的输出。
#include <stdio.h>
int main()
{
int a, b,c, d;
a=3;
b=5;
c=a,b;
d=(a,b);
printf("c = %d" ,c);
printf("\nd = %d" ,d);
return 0;
}
这个程序的输出为:
c=3
d=5
我不明白输出结果是如何产生的?
我正在运行一段代码片段。但是我无法理解代码和它所产生的输出。
#include <stdio.h>
int main()
{
int a, b,c, d;
a=3;
b=5;
c=a,b;
d=(a,b);
printf("c = %d" ,c);
printf("\nd = %d" ,d);
return 0;
}
c=3
d=5
d=(a,b);
会被计算为 d=b
。=
比逗号有 更高的优先级,因此表达式 c=a,b;
被计算为 (c=a),b;
这不是答案的一部分,但值得一提的是整个 c=a,b;
表达式被计算为 b
,而不是 a
,例如如果你写 d=(c=a,b);
,你会得到 c=a
和 d=b
;
考虑C语言中逗号运算符的优先级。
请注意,逗号运算符在C++中可能会被重载。因此,实际行为可能与预期非常不同。
例如,Boost.Spirit相当巧妙地使用逗号运算符来实现符号表的列表初始化器。因此,它使得以下语法成为可能且有意义:
keywords = "and", "or", "not", "xor";
(((keywords = "and"), "or"), "not"), "xor";
也就是说,首先调用的是关键字操作符 keywords.operator =("and"),它返回一个代理对象,其余的操作符都在该代理对象上被调用:
keywords.operator =("and").operator ,("or").operator ,("not").operator ,("xor");