2013-05-06 77 views
0

我在這裏有兩個問題。在C/C++中傳遞參數

Q1: 什麼將下面的程序輸出(32位小端機器上):

int main() 
{ 
    long long a = 0x1, b = 0x2, c = 0x3; 
    printf("a = %d, b = %d, c = %d.\n", a, b, c); 
    return 0; 
} 

,爲什麼?

Q2:

爲什麼的abc輸出有什麼不同?

void func(int a, int b, int c) 
{ 
    printf("a = %d, b = %d, c = %d.\n", a, b, c); 
} 
int main() 
{ 
    long long a = 0x1, b = 0x2, c = 0x3; 
    printf("a = %d, b = %d, c = %d.\n", a, b, c); 
    func(a, b, c); 
    return 0; 
} 
+2

如果您將第一個和第三個設置爲默認值,那麼當我給它兩個參數時,您希望它執行什麼操作?至於其他一切,只是未定義的行爲。 – chris 2013-05-06 04:44:17

+0

@chris但爲什麼我不能只將第一個參數設置爲默認值? – imsrch 2013-05-06 04:46:20

+0

閱讀關於函數重載。你可以用它做你想做的。 – 2013-05-06 04:48:08

回答

0

對於Q1:由於拇指規則是,所有默認Pramaeters應在右手邊,func(int a = 1, int b, int c) voilates因爲一個= 1的規則。它會顯示錯誤,因爲如果我們編寫func(5,6),編譯器不會理解5將被分配給ab。在調用功能時,參數從左向右分配。這是基本的基礎。

Simlarily for func(int a = 1, int b, int c = 3)如果我們調用func(7),編譯器會嘗試將7分配給a,但b沒有任何內容。所以這也會導致錯誤。

0

這僅適用於Q3。

簡單的答案是printf不是類型安全的。格式字符串被解析,並且基於遇到的說明符,printf函數從可變參數列表中提取適當大小的數據。

當你看到正確的代碼時,這一切變得更加清晰。由於您所傳遞long long參數需要指定正確的長度子符(INT這種情況下,「LL」):

printf("a = %lld, b = %lld, c = %lld.\n", a, b, c); 

注意「LL」這告訴printf的有多大的參數是和你的情況下,他們是您通過的計劃「%d」的兩倍(在目前的大多數硬件上)。