2014-11-05 172 views
2

什麼意思return語句++

未能提供包含返回處於錯誤

一個循環結束後返回 「C++底漆第五」,295頁?

尤其是,編譯器沒有檢測到這個錯誤,運行時發生了什麼是未定義的。

我用書樣本,如:(vs2013)

#include "stdafx.h" 
#include "iostream" 
#include "string" 
using std::string; 

bool str_subrange(const string &str1, const string&str2) { 
    if (str1.size() == str2.size()) 
     return str1 == str2; 
    auto size = (str1.size() < str2.size()) ? str1.size() : str2.size(); 
    for (decltype(size)i = 0; i != size; ++i) { 
     if (str1[i] != str2[i]) 
      return false; 
     else 
      return true; 
    } 
} 

int _tmain(int argc, _TCHAR* argv[]) { 
    if (str_subrange("lyc", "talent")) 
     std::cout << "yes" << std::endl; 
    else 
     std::cout << "nope" << std::endl;; 
    system("pause"); 
    return 0; 
} 

它運作良好,我想知道哪些情況是「回報」是必須的。

+2

嘗試調用'str_subrange(「」,「anything」)''。 – timrau 2014-11-05 03:55:52

+0

請注意,你的函數只會比較'str [0]'和'str [1]' - 在第一次迭代中返回。 – GingerPlusPlus 2014-11-05 07:36:51

回答

2

如果size最終爲0(字符串例如一個是「」),你的循環永遠不會運行。如果循環從不運行,那麼返回的內容是未定義的,因爲程序不會寫入返回給函數調用者的結果。你得到的結果是任何預先存在於棧中預期返回值的內存內容。

當您決定在循環或其他分組語句(例如「if」)中返回值時,請始終在您的頭部手動運行您的代碼,以確保您在每個有效路徑上返回值,並且即使循環不跑。

+2

「您得到的結果是預先存儲在堆棧中預期返回值的內存內容中的任何內容。」 - 這不完全正確。例如,[here](http://goo.gl/W7IMWo)'bar'總是返回1,即使它從foo中選擇使用返回非值的分支。如果使用警告進行編譯,也不需要手動跟蹤丟失的返回值。 – chris 2014-11-05 04:17:26

+0

@chris,酷網站,但對不起,我的集會不是最好的。 G ++看起來可以在不設置返回值的情況下跳出foo,儘管bar始終返回相同的結果。那是你在做什麼?鏗鏘3.4.1看起來更寬容(並給出警告),並總是給兩個例子1。 – MtRoad 2014-11-05 04:37:19

+1

是的,'foo'就是它的樣子 - 如果給定值不是0,則返回1,如果給定值爲0,則只返回沒有指定值的值。但隨後'bar'會使事情變得更有趣。如果它調用'foo(0)',編譯器知道這是未定義的行爲,因此該分支永遠不會被採用。編譯器假定分支不能被採用,並且總是選擇另一個分支,它只返回1.除此之外,GCC肯定會用'-Wall'給出該警告。 – chris 2014-11-05 04:46:05

4

如果size是0,for循環根本不會執行,因此該方法沒有返回值。

0

在這種情況下使用循環,如果條件,總是從函數結束返回,分配在開始一個返回值並更新根據條件值。