2011-08-05 146 views
1

每當我們調用函數返回值爲什麼它不需要捕獲值? 考慮下面的C代碼,函數返回可選值

int main() 
{ 
     int i; 
     scanf("%d",&i); 
     printf("Value of i is: ",i); 
     return 0; 
} 

這裏scanf()的返回值1,但它不中的任何地方釣到爲什麼沒有錯誤彈出? 允許這種編程的原因是什麼?

回答

5

主要是因爲C表達式也能產生價值。例如:x = 1;的值爲1.有時,您將其用於多個任務,如x = y = 1;,但更多情況下您不需要。

在C月初,void返回類型還沒有發明要麼,所以函數返回一定的價值,無論是一般有用或沒有(例如,你的電話printf也返回一個值)。

語言的規則不會使這個錯誤(這樣做會失去與現有代碼的兼容性),並且由於這很常見並且很少指出問題,所以大多數編譯器也不會警告它。有幾個皮棉工具,這導致一些誤導的程序員編寫像(void)printf("whatever");這樣的東西(例如,將未使用的回退投入void,以表明它在被忽略時確實是故意的,然而,這很少有用,並且經常會造成相當多的傷害,所以(幸好)它很少被看到。

0

很多庫函數都會返回你可能沒有想到的值。想象一下,必須使用每個printf調用的返回值! (printf返回打印的字符數。)

5

返回值的函數具有用於編程人員的使用和方便的功能。如果您對返回值不感興趣,請不要使用它。

0

幾乎每個本地c函數都返回一個int。包括scanfprintf。如果你總是不得不「捕捉」它來滿足編譯器,那將是非常煩人的;在一個大型程序中,您最終會創建數千個變量,僅用於存儲您從未看過的返回值。

+1

另請注意,一個好的編譯器實際上會生成* more wa rnings *(!!)如果你這樣做,將值存儲到變量中,然後再讀取它。這很可能表示編程錯誤。 –

0

原因是C沒有其他確定的方式來處理錯誤,而不是返回值。這些返回的值,也就是說那些返回報告成功或失敗的應用程序,應該幾乎總是被檢查(除非你只是在亂畫或者你有證明函數不會失敗)。

現在因爲返回值是用於其他事情比返回成功/失敗的信息可能有,並且是,您不會對函數返回的值感興趣的情況下,但只是執行的副作用它。在這種情況下,強制程序員檢查/綁定返回的值將變得相當可觀。

+0

第二段+1, – nobalG

+1

有時成功/失敗也是無趣的。例如,如果打印錯誤消息失敗,你打算怎麼做?打印另一個錯誤消息,告訴它失敗的原因祝你好運,那個... :-) –

0

簡單:如果您不使用返回值,則不使用它。

這不是你的要求。

(這就是說,在這樣的情況下,你應該:你不知道目前是否scanf遇到錯誤)

1

在這個例子中,你是否需要返回值?NO。所以你沒有在這種情況下使用它。但在另一種情況下,回報價值可能很重要。例如,如果你想閱讀,只要在輸入流中提供一些整數,那麼你可以做這樣的事情:

while (scanf("%d", &i) == 1) { 
    // do something 
} 

如果有一個EOF那麼這個循環將打破。這裏需要返回值。

因此,摘要是在需要時使用返回值,並且在不需要時不使用。允許這樣的編程,因爲兩種情況都是可能的。

0

這並不是說每次的值進行評估的情況下,&它必須被存儲或退回,因爲你已經得到的值可以通過一些其他功能一起使用,以評估不同類型things.A值可能是測量...例如,考慮下面這個簡單的PROGRAMM,在這裏我們要檢查輸入的號碼是偶數還是不

'int main() 
{ 
int a; 
printf("Enter a number"); 
scanf("%d",&a); 
if(a%2==0) 
printf("even number"); 
    else 
printf("odd no"); 
    return 0; 
    }' 

這裏的變量「a」是不是一定要退還,因爲我們只是想檢查數量是偶數還是奇數......不需要返回

+0

-1這不是C. –

+0

哦對不起,我錯過了c標籤,感謝-1 ..:).. @ R .. – nobalG

+0

如果你做一些編輯I會把它拿走。無論如何,我認爲這是一個不好的答案的原因是,在這樣的問題上,這些問題涉及到警告與錯誤以及不允許其他程序員認爲是最佳實踐的事情,這實際上是C++類C類與實際類之間的巨大差異之一C. –