關於c語言自定義的函式,如果是void型別,那麼嚴格意義上這個函式它是返回空值還是根本就沒有返回值?

時間 2021-06-02 13:11:06

1樓:斷賦千歌

當呼叫乙個 long 返回值的函式時,執行函式的 return 語句時,會將返回值刻意存放在 rax 中。 意味著呼叫者可以讀取 rax 來獲得函式返回的結果。void 函式,在執行 return 語句時,不會刻意的修改 rax 的值

在函式的呼叫的過程,會利用 rax 暫存器作為臨時變數,在 void 函式呼叫後,rax 的值是未定義的

2樓:希爾伯特Sama

從代數型別系統的角度,稱為空返回值更合理一些。

比如rust語言會區分空型別()和無型別(never type),空型別代表可能的值只有一種的型別,其不占用記憶體空間,而never type代表這個值永遠不會返回,比如rust給無限迴圈賦予返回值型別為never type。never type的可能值數量為0,而其占用的空間log 0不存在,因此其永遠不會被構建出來。

3樓:undefined

具體到C來說,void型別返回值在實現上是「返回值無意義」的意思,在語法上是等同於「沒有返回值」的意思,但是並不一定確切是這個意思,因為只要這樣做無法通過編譯,那麼實際上這個函式就沒有返回值:

void

foo()

{}int

main

(void

)那麼我們看看編譯器們都會抱怨什麼,首先是gcc:

error: void value not ignored as it ought to be

也就是說,對gcc來說,void確切的語義是「值應當被忽略」,也就是說,是「值無意義」的意思。

而clang:

error: initializing with an expression of incompatible type 'void'

或者error: variable has incomplete type 'void'

clang的處理方法,是令void型別無法轉換為任何型別,而同時變數也也無法被定義為void型別,這樣也就實現了任何變數都不能被void型別函式的返回值賦值。

至於為什麼說「在實現上」一定是「返回值無意義」呢,因為返回值的返回方法已經被呼叫協定規定好了,而函式無論做什麼,那個用於儲存返回值的東西一定有值。所以在實現上函式實際上做不到無返回值,但是在語法上還是可以做到的。

4樓:Icecor

函式是void型別,說明沒有返回值。函式內部可以寫return也可以不寫。自己寫return,編譯器不會幫你加返回語句,自己不寫return編譯器會幫你新增return語句。

最終實現函式返回。

5樓:開開心心學做人

就是沒有返回值,有返回值的函式是把返回值放入eax暫存器中(所以只能有乙個返回值),然後呼叫ret彙編指令。所以void的就是沒有這步操作。

C 中的sort函式使用自定義比較函式的具體執行過程是怎麼樣的呢

路明非 你只是覺得實現降序排序比較神奇,但對於演算法來說都是一樣的。對於函式bool f a,b a b 只要任意兩個數字滿足自洽性就可以了,所謂自洽性就是如果a b返回true,b c返回true,則a c一定返回true。當然還要其他條件,這樣可以保證你的輸入序列的有序性。演算法唯一需要做的就是...

C語言可否自定義數值型別 或是任意個位元組的數值型別

null122 struct myStruct BHEscaper 已經有人回答了 Bit fields 在這裡我補充一下,使用 Bit fields 要注意位元組序的問題。How Endianness Effects Bitfield Packing 上面鏈結比較詳細的說明了位元組序對 Bit f...

虎牙卡爾直播的是自定義嗎?

已登出 現在不是自定義了。昨天看了一會,卡爾遇到一位臥龍,然後就帶他一起玩,今天開啟的時候剛好又看到和昨天那位臥龍在一起玩,很巧不巧的看到左下角的聊天記錄漏了字的一半 不知道是不是有意還是大意 然後搜了一下這位臥龍的名字,結合昨天以及今天的戰績,重複的只有三個ID,這個22連勝是卡爾玩的,怎麼分析的...