void f()
表示f
什麼也沒有返回。如果void
不返回任何內容,那麼我們爲什麼使用它? void
的主要用途是什麼?如果void()不返回一個值,爲什麼我們使用它?
回答
當C發明時,慣例是如果你沒有指定返回類型,編譯器會自動推斷你想返回一個int
(對於參數也是一樣)。但是你經常編寫一些函數來執行某些操作,並且不需要返回任何東西(比如想象一下只是在屏幕上打印某些東西的函數)。出於這個原因,決定爲了指定你根本不想返回任何東西,你必須使用void
關鍵字作爲「返回類型」。
請注意,void
也可用於其他用途;特別是:
如果您指定它作爲函數參數列表,則表示函數不帶參數;這在C中是需要的,因爲沒有參數的函數聲明意味着編譯器參數列表沒有被指定。在C++中,這不再需要,因爲空參數列表意味着該函數不允許使用任何參數;
void
在指針中也有重要的作用;void *
(及其變體)表示「指向未指定的東西的指針」。如果您必須編寫必須存儲/傳遞指針而不實際使用它們的函數(僅在最後才能實際使用指針,需要將類型轉換爲適當類型),這非常有用。此外,鑄造到
(void)
通常用於將值標記爲故意未使用,從而抑制編譯器警告。int somefunction(int a, int b, int c) { (void)c; // c is reserved for future usage, kill the "unused parameter" warning return a+b; }
實際上「(void)c」在做什麼? – innochenti 2012-07-19 12:01:49
顯式丟棄右側表達式的值。無論如何,即使你不寫'(void)',它也會這樣做,但它(向讀者和編譯器)闡明你真的不關心返回值;這用於在您明確不關心這些值的情況下關閉一些警告(未使用的返回值,未使用的參數)。同樣,它對生成的代碼沒有任何特別的影響,但它是一個表達特定含義的習慣用語。 – 2012-07-19 12:06:00
@innochenti:參見例如[here](http://stackoverflow.com/a/4178714/214671) – 2012-07-19 12:10:28
因爲有時你不需要返回值。這就是我們使用它的原因。
如果你沒有void
,你會怎麼告訴一個函數沒有返回值的編譯器?
如何不指定任何東西?例如。只是簡單的'fooFunction(){}'而不是'void fooFunction(){}'? – 2013-05-08 10:03:36
@AmitTomar在C++中,你_必須指定一個返回類型。在C中沒有返回類型意味着'int'。 – 2013-05-08 10:08:57
我的意思是,爲什麼不能在C++中它是這樣,告訴一個函數沒有返回值,離開了返回類型爲空白編譯器。要指定特定類型,請寫入類型。爲什麼寫作無效的特殊要求?這更多的是設計決定嗎? – 2013-05-08 10:22:27
在命令式編程語言(如C,C++,Java等)中,使用void
類型的函數和方法會產生副作用。它們不會產生有意義的價值來回報,但它們會以許多可能的方式之一影響程序狀態。例如,C中的exit
函數不返回任何值,但它具有中止應用程序的副作用。另一個例子,一個C++類可能有一個void方法來改變它的實例變量的值。
其實'printf'返回的int值等於打印的字符數。 – 2012-07-19 11:49:55
@PaulR哎呀,你是對的。我的臉紅了... – waldrumpus 2012-07-19 12:24:39
@PaulR順便說一句,我該如何做刪除線的文字?我想通過printf示例來避免使您的評論無效,但我無法弄清楚。 – waldrumpus 2012-07-19 12:31:33
void()表示不返回任何內容。
void
並不意味着沒有。 void
是類型到代表沒什麼。這是一個微妙的區別:表示仍然是必需的,即使它代表什麼。
This type is used as function's return type which returns nothing。當它用作void*
時,這也用於表示通用數據。所以,它聽起來有趣的是,雖然void
代表什麼,void*
代表一切!
有時,它可用於打印的東西,而不是返回。請參閱http://en.wikipedia.org/wiki/Mutator_method#C_example舉例
你介意解釋一下嗎? – Shahbaz 2012-07-19 11:49:05
這個問題與語言的歷史有關:C++從C中借用,C用於隱式輸入所有類型爲int
(事實證明這是一個可怕的想法)。這包括用作過程的函數(回想一下,函數和過程之間的區別在於函數調用是表達式,而過程調用是語句)。如果我正確地記得它讀取早期的C語言的書籍,程序員用來修補這一缺陷與#define
:
#define void int
該公約後來被C標準中採納,並void
關鍵字已被引入到表示功能這些目的是作爲程序。這是非常有用的,因爲編譯器現在可以檢查你的代碼是否使用了一個函數的返回值,該函數不打算返回任何東西,並且警告你應該返回的函數,而是讓控制器運行結束。
+1,因爲我在舊代碼中看到了這個'define'語句,被帶有荒謬標籤的'ifdef'阻止了,並且無法弄清楚爲什麼有人寫了它。 – 2014-02-03 23:37:44
原因考慮某些情況下,你可能不得不做全局變量一些計算,放在全局變量的結果或要打印的東西取決於參數,等等。在這些情況下,你可以使用不返回值的方法..即無效
下面是一個例子功能:
struct SVeryBigStruct
{
// a lot of data here
};
SVeryBigStruct foo()
{
SVeryBigStruct bar;
// calculate something here
return bar;
}
而現在這裏的另一個功能:
void foo2(SVeryBigStruct& bar) // or SVeryBigStruct* pBar
{
bar.member1 = ...
bar.member2 = ...
}
的第二個函數更快,它不必複製整個結構。
- 1. 爲什麼我們不需要在「使用」範圍之外返回一個值?
- 2. 爲什麼我不能從Java中的void函數返回值?
- 3. 爲什麼我不得不爲None返回一個類型值?
- 4. 我希望返回一個deque條目的值。爲什麼是「Void」?
- 5. 爲什麼它返回一個錯誤?
- 6. 爲什麼我們不能從C中的函數返回多個值?請原因?如果可能的話,如果返回多個值,則返回
- 7. 如果數據不同,Union會返回兩行,如果它們相同,則返回兩行!爲什麼?
- 8. 我們爲什麼要使用`realloc`如果我們需要一個'TMP buffer`
- 9. 我們何時應該釋放一個對象,如果我們返回它?
- 10. 返回停止一個函數並返回一個值。但爲什麼使用它在一個變量?
- 11. 什麼是EJB回調,爲什麼我們需要它們?
- 12. 爲什麼我的代碼返回一個不正確的值?
- 13. 如何評價爲什麼一個方法返回它返回什麼
- 14. 我們爲什麼要返回deferred.promise()
- 15. 爲什麼addListener()通常返回void?
- 16. 爲什麼Servlet.service旨在返回void?
- 17. 裝配需要什麼?爲什麼我們使用它們?
- 18. 爲什麼我們不使用短整數來表示返回值?
- 19. 爲什麼math.bignumber()返回一個對象?我該如何使用它?
- 20. 爲什麼返回一個布爾值,如果沒有被使用?
- 21. 爲什麼我們使用unwind segue,如果我們可以使用segues返回任何視圖控制器?
- 22. struct.field返回另一個值,爲什麼?
- 23. 爲什麼printf返回一個值?
- 24. 爲什麼我們需要一個返回地址?
- 25. 何時以及爲什麼我們返回一個java類?
- 26. 如果表達式返回true/false,爲什麼我不能在一個case中使用它?
- 27. 爲什麼這個函數返回void而不是虛假
- 28. 如果我們不能釋放它,malloc的行爲是什麼
- 29. ResultSet不返回DB2的值,但它返回值,如果我嘗試做它manualy
- 30. 爲什麼它返回空值?(網絡)
要返回任何結果,OBV。只有副作用並且不返回計算值的函數是完全合法的。 – 2012-07-19 13:13:45