2013-03-10 180 views
1

代碼:哪裏參數傳遞給函數時沒有聲明參數

foo() 
{ 
} 
int main() 
{ 
    int a=20; 
    a = foo(20); 
    printf("\n\n\t A : %d",a); // will print zero. 
} 

問:

  1. 您可能會注意到,有foo的返回類型()。而且這是 被認爲是'int',爲什麼?爲什麼這個'隱式int'規則?爲什麼C的設計師非常喜歡'int'?

  2. foo()沒有參數聲明,它說它可以接受 可變數量的參數。那麼傳遞的參數在哪裏呢? 例如富(20)20去了哪裏?

  3. 在上例中printf打印爲零,爲什麼?


現在考慮:

foo() 
{ 
} 
int main() 
{ 
    int a=20; 
    a = foo(a); 
    printf("\n\n\t A : %d",a); // It'll print 20. 
} 
  • 現在的printf打印20爲什麼不喜歡0更早?
+1

打開編譯器警告。 – 2013-03-10 20:57:40

回答

1
  1. 這是我的理解是原來的C規格歷史的東西。它仍然在規範中,如果你沒有說明返回類型,那麼它是int。這並不意味着你應該利用它。在我的書中這是不好的風格。

  2. 閱讀:Is it better to use C void arguments "void foo(void)" or not "void foo()"?

  3. 你所觀察是不確定的行爲,這是你當您使用的返回值不返回任何一個功能。

+0

@VishalD您需要了解如何打開警告。如果您使用GCC或Clang,則使用'-Wall'。 – 2013-03-10 20:58:56

+0

@VishalD我發現了一些關於2號點的東西。 – paddy 2013-03-10 20:59:47

+1

問題2:在執行過程中會發生什麼,'main'將20作爲int參數推入堆棧,然後'foo'不使用它, foo'返回,'main'清理參數。 – che 2013-03-10 21:01:37