這個圖左邊這個程式的輸出值不太懂為啥是10

時間 2021-05-11 23:09:49

1樓:張浩

實際上機試一下,開啟gcc的-Wall選項,把所有的warning處理掉。

養成0 warning的好習慣,以後自然就懂了。

2樓:卡卡超人

因為printf執行成功時返回列印的字元個數。

C89標準預設返回值為int

返回值一般是儲存在eax(看環境,ax rax)暫存器內,因為printstar執行printf後直接返回,eax沒有被修改,直接被賦值給變數a,也就是10。

所以這個printstar的返回值就是printf的返回值,或者說是隨機的,因為不能保證其他平台就是這樣處理。

話說都2023年了,怎麼還有學校教C89?

3樓:

你老師的意思那不是很明確了?他想讓你知道的不是輸出10,而是輸出不確定

這麼幾個知識點:

1、return負責返回,return後面表示式的值就是整個函式的返回值

2、函式頭部,函式名左邊的是函式返回值的型別,如果沒寫的話預設為int。

3、函式返回值由return後面的表示式決定,返回值的型別由函式頭部寫明。如果型別不一致,則相當於要做一次強制型別轉換。(敲黑板劃重點,多念幾遍)

4、每個函式末尾必定有一句,return,你寫了他自然有,你沒寫編譯器自動給你加一句(這句話最近幾年沒再見到過,不知道是不是新版C語言修改過了)。

5、如果函式返回值非void,且return後沒寫返回值,那麼函式將返回乙個「隨機值」。你當做隨機值就行了,實際上跟硬體平台、作業系統都有關係)

從這張ppt能確定,知道上面這些就夠了

4樓:

盡量淺顯的解釋一下,不涉及太多東西。但是如果題主不了解一些底層東西的話可能真的不好講。

注意:以下只是乙個簡單的感性理解,實際上限制很多。比如暫存器部分是針對X86來的,而且不宣告返回值型別預設int的函式寫法其實是C89的東西,實際非常不建議這樣寫。

一句話,函式返回時通過將返回值裝入eax暫存器的方式講返回值傳遞給上一層函式。

你呼叫printf的時候返回值是輸出字元數,是10。此時10裝入eax,然後ret。然後你沒管這個返回值,不過這不重要。

然後你外層printstar函式也結束了,你沒有返回任何東西。此時eax內是printf的返回值10。

到了最外層,main函式中那一行語句需要printstar的返回值,怎麼找呼叫函式的返回值?去eax找,所以直接把eax裡邊的用了。然而呢,eax此時裡邊是printf在返回時裝入的返回值。

所以,你printstar的「返回值」就是10了。

至於為啥加void不行,這是因為編譯器在語法檢查時候發現你要用乙個void函式的返回值,當然是錯誤的了。而你不加void就能編譯,你可以理解為「掩耳盜鈴」。

有興趣可以試一下讓內層函式返回乙個非int的東西,比如32位的float或者64位的double,也可以自己開啟除錯視窗看看實際編譯出來的彙編是怎麼跑的。

5樓:Anbang24

左邊那個函式為什麼沒有返回值型別呢?正常的老師應該教學生:函式要麼有返回值型別,要麼就寫成void。如果既不寫返回值型別又不寫void,那就是鑽牛角尖自找麻煩。

6樓:飛鳥

充分證明了,學校學了很多無用的東西。

function func() 了,不這樣寫會被罵死。

7樓:

SYNOPSIS

#include

int printf(const char *format, ...);

RETURN VALUE

Upon successful return, these functions return the number of characters printed (excluding the null byte used to end output to strings).

節選自Manual page printf(3)

C語言輸入123輸出321這個程式怎麼寫?

intserver int data return int n n?int n 0 NoneType include void function void intmain include using namespace std void function void intmain include i...

很簡單的matlab程式,這個值為什麼等於乙個極小值但是不為0?

雄氏老方 一點程式設計上的小建議,如果你的函式中物理量都很小 例如e 7以下 你可以調整公式裡面的物理量量綱。例如原來是kg L 調整成ug L 這樣可以避免浮點數四捨五入誤差 已登出 捨入誤差的問題。譬如 這樣乙個算式,我們都知道 時有 但是計算機在計算 的時候並不能以分數的方式儲存,只能以小數的...

Java 類的繼承例項,為什麼輸出這個?

adri1 宣告M h new H C c new H 呼叫c.f h h.g c 返回in M.f in H.g c的型別是C,傳入引數型別是M 所以呼叫的方法是 M中定義的f M m 返回 M.fh的型別是M,傳入引數型別是C 因為M沒有g C c 的方法,只有過載到g M m 由於不知道是bu...