2012-04-16 82 views
4

考慮下面的代碼:雙括號

#include <stdio.h> 

int aaa(char *f, ...) 
{ 
    putchar(*f);  
    return 0; 
} 

int main(void) 
{ 
    aaa("abc"); 
    aaa("%dabc", 3); 
    aaa(("abc")); 
    aaa(("%dabc", 3)); 
    return 0; 
} 

我想知道爲什麼下面幾行:

aaa("abc"); 
    aaa("%dabc", 3); 
    aaa(("abc")); 

運行沒有錯誤,但第四行(如下圖所示):

aaa(("%dabc", 3)); 

生成以下錯誤:

main.c中:15:2:警告:傳遞 'AAA' 的參數1,使指針從整數,未作鑄造

main.c中:3:5:注:應爲 '字符*',但參數是類型`詮釋」

+3

這些是括號,而不是括號。 – 2012-04-16 13:12:22

+0

@soohjun:修正了它 – JeremyP 2012-04-16 13:26:10

回答

12

聲明

​​

的調用與返回值3參數("%dabc", 3)功能aaa

查詢comma operator瞭解更多信息。

+1

...和'3'不兼容'char *'(aaa'的第一個參數的類型),所以編譯器會給你一個警告。 – pmg 2012-04-16 13:16:47

+0

爲什麼有人會寫'aaa((「abc」))?這些雙面人有什麼用處嗎? – Eregrith 2012-04-16 13:18:31

+1

有時在調用宏時需要一個額外的參數集,例如當該參數本身是一個可變參數列表,隨後傳遞給可變參數函數。但我認爲這樣做對於一個直接的函數調用來說沒有任何意義。 – 2012-04-16 13:23:20

1

左值(「xxx」,val)計算「xxx」,然後計算val並將結果返回括號中的最後一個值,即val。 aaa(...)中的括號是參數。

+0

我會刪除我的答案,Joachims的回答是更好的:-) – 2012-04-16 13:15:32

1

由於參數被傳遞給功能是("%dabc", 3)本身調用逗號運算並返回3值。

2

與數學一樣,函數調用中的括號被解釋爲分組:例如, (1) * (2)1 * 2相同,但(1 + 2) * 31 + 2 * 3不相同。

在第一個示例中aaa(("abc")):首先評估內部圓括號,但("abc")與​​相同,因此這相當於僅調用aaa("abc");

在第二個例子aaa(("abc",3)):內部表達是("abc", 3)comma operator進場和​​被丟棄,留下3作爲參數aaa。編譯器正在抱怨,因爲3的類型爲int而不是char*,因此您沒有正確調用該函數。

+0

絕對最清晰的答案,+1 – 2012-04-16 13:28:05