2012-04-30 73 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");