簡體   English   中英

C ++返回值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM