2011-09-24 62 views
1

讓我們假設我有跟隨着代碼C評價秩序

#define CHECK(result) do{       \ 
          if(result == 0)   \ 
           return false; \ 
          } while(0) 


int sum(int a, int b){ 

    return (a + b); 
} 

int main(){ 
    int a = b = 0; 
    CHECK(sum(a + b)); 
    reutnr 0; 
} 

我的問題是:如何評價C中的順序,我的意思是:

result = sum(a, b) 
//and only after checking    
if(result == 0)   
    return false;  

if(sum(a + b) == 0)   
    return false; 

在此先感謝

回答

1

宏替換將完成實際的編譯器甚至認爲之前的代碼,使編譯的代碼會讀

int main(){ 
    int a = b = 0; 
    do { 
    if(sum(a+b) == 0) 
    return false; 
    } while(0); 
    reutnr 0; 
} 

永遠不會有一個名爲result變量。

還要注意的是C沒有一個叫false關鍵字。

+0

C99具有宏真,假定義爲1,0,但你的權利,這是一個不好的做法,在平原C. –

+0

特別是在這裏,其中一個int有望和'假== 0 ==用真,假EXIT_SUCCESS'。 – user786653

0

C宏是純文本• ubstitutions。編譯器會清楚地看到:

do { 
    if(sum(a + b) == 0) 
    return false; 
} while(0); 

您的宏不「生成」一個result變量。