[英]c++ return value
我在c ++中有以下代碼:
int fff ( int a , int b )
{
if (a>b )
return 0;
else a+b ;
}
雖然我之后沒有寫“ return”,但這不會出錯! 在我寫的main()中:
cout<<fff(1,2);
它印了1嗎? 怎么發生的
誰能解釋一下?
這就是所謂的未定義行為 。 什么都可能發生。
C ++不需要總是在函數的末尾返回一個值,因為可以編寫永不到達那里的代碼:
int fff ( int a , int b )
{
if (a>b )
return 0;
else return a+b;
// still no return at end of function
// syntactically, just as bad as original example
// semantically, nothing bad can happen
}
但是,編譯器無法確定您是否永遠無法到達函數的結尾,並且它最多只能發出警告。 您有責任避免跌倒而無return
。
如果這樣做,您可能會得到一個隨機值,否則可能會崩潰。
$ 6.6.3 / 2-“從函數的結尾流出就等於沒有值的返回;這導致在值返回函數中出現未定義的行為 。”
編譯器可能會或可能不會診斷這種情況。
這里
否則a + b;
被視為沒有任何副作用的表達。
“隨機”返回值取決於調用后的CPU寄存器值,因為調用后寄存器為1,所以該值為1。
如果更改代碼,該函數將返回不同的值。
如果您犯了這樣的錯誤,一個好的編譯器(例如gcc)將發出警告,並且如果遇到任何警告,請使用命令行開關返回非零錯誤狀態。 這是不確定的行為:您看到的結果是編譯器通常期望函數返回int的位置處發生的任何值:例如,累加器寄存器或堆棧上的某個位置。 您的代碼不會將a + b復制到該位置,因此將看到最后放置的內容。 不過,您甚至不能保證會得到結果-如果函數沒有return語句,則某些編譯器/體系結構可能會執行某些操作,可能會使機器崩潰:例如-pop()根據假設從堆棧中獲取一個值該返回已推入一個-堆棧的將來使用(包括讀取函數返回地址)可以從高於或低於預期地址的內存地址中獲得結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.