无法理解输出的原因

我正在运行代码段。 但我无法理解它产生的代码和输出。

#include  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 

我没有得到输出的结果?

考虑C的逗号运算符的优先级。

  1. 当你有逗号时,表达式被评估为正确的参数,这就是为什么d=(a,b); 被评估为d=b
  2. =具有比逗号更高的优先级 ,因此表达式c=a,b; 被评估为(c=a),b;

不是答案的一部分,但值得一提的是整个c=a,b; 表达式,被评估为b ,而不是a,例如,如果你写d=(c=a,b); 你得到c=a AND d=b ;

请注意,逗号运算符可能在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");