2012-04-30 78 views
3

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

#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 

我没有得到的输出是怎么来的?

回答

3

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

9
  1. 当你有一个逗号,为什么d=(a,b);作为d=b计算的表达式被评估为正确的参数,这就是。
  2. =具有higher precedence在逗号,所以表达式c=a,b;被评价为(c=a),b;

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

1

请注意,逗号运算符可能在C++中被重载。实际行为可能与预期的行为有很大不同。

作为示例,Boost.Spirit使用逗号运算符非常巧妙地实现了符号表的列表初始值设定项。因此,这让下面的语法可能的和有意义的:(!有意地)

keywords = "and", "or", "not", "xor"; 

注意的是,由于运算符优先级,代码是相同的

(((keywords = "and"), "or"), "not"), "xor"; 

也就是说,称为第一运营商的关键字.operator =(“and”)它返回一个代理对象,其余操作符被调用:

keywords.operator =("and").operator ,("or").operator ,("not").operator ,("xor");