2010-10-01 85 views
4
int main() 
{ 
    int main=5; 
    printf("%d",main); 
    return 0; 
} 

在這種情況下,沒有錯誤,gcc編譯器打印5.但是,如果我寫我們可以使用main,printf,scanf命名標識符嗎?

int main() 
    { 
     int printf=5; 
     printf("%d",printf); 
     return 0; 
    } 

編譯器顯示的error..why?

+0

AFAIK第二個例子應該用C++的工作,如果你使用''::運營商中的printf調用,如:'::輸出( 「%d」,printf的);' – smerlin 2010-10-01 15:05:53

回答

2

在你的第一個代碼段,您聲明一個局部變量主要,這是在當地範圍,所以對全球範圍無影響(其中的main()函數聲明)

在第二個代碼片段中,您聲明全局範圍內的「printf」,其中的函數將在其中生效,因此存在衝突。

+0

Downvoted?沒有理由??謝謝。 – 2010-10-01 12:25:25

+1

這不是我低估了你的意思,但是假設printf行應該在main裏面,你的解釋是錯誤的。發生該錯誤是因爲他正在嘗試將一個名爲printf的int(它影響函數聲明)作爲函數處理。 – JeremyP 2010-10-01 12:51:06

1

出於任何原因,不應將函數名稱用作變量名稱。

+2

這不是一個答案。 – sje397 2010-10-01 12:20:49

+0

這是題目問題。 – 2010-10-01 12:24:18

+0

「是的,但你不應該」將是一個答案。你有什麼只是建議。 (順便說一下,我沒有DV) – sje397 2010-10-01 12:31:28

2

在第二個示例中,您聲明瞭一個名爲'printf'的類型爲'int'的局部變量。這將優先於同名的全局函數。所以錯誤在於名字'printf'是指一個int,而不是一個函數。

在第一個示例中,用局部變量'main'覆蓋全局函數名'main'。如果你沒有這樣做,你實際上可以在主函數中調用'main'函數,而且這樣做會起作用。隨着你的變量聲明,這是不可能的,因爲局部變量聲明優先 - 但它仍然是完全可用的變量形式。

9

在你的第一個例子中,你「隱藏」了main函數,用int對象代替它。

在你的第二個例子中,你「隱藏」了printf函數,用一個int對象代替它。 試圖撥打int是非法的。

5("foo"); /* illegal to call "function" 5 */ 
相關問題