2013-02-05 60 views
0

實施例1:單步Return語句或多步Return語句

int length() 
{ 
     return strlen(random_string); 
} 

實施例2:

int length() 
{ 
     int str_length = 0; 
     str_length = strlen(random_string); 
     return str_length; 
} 

問題:
我所遇到的許多功能,其中一個單一的代碼線可以滿足該功能的必要條件,但我想起了一些有關避免這種快捷方式的內容。

是否有某些情況下,一個比另一個更合適,或者我應該總是去尋找更簡單的代碼。

+2

對於一個體面的編譯器,這應該沒有什麼區別。選擇更可讀或可維護的任何內容。 –

+1

@AndyProwl:然而,NRVO .... –

+0

這是更好地做多行語句,如果函數執行多個操作,並執行變更的可能性不是零。 – Shmiddty

回答

1

一個原因,AA多步驟的做法是,如果你決定要添加一行打印長度值,這是少了很多麻煩:

int length() 
{ 
    const int str_length = strlen(something); 
    printf("str_length = %d\n", str_length); 
    return str_length; 
} 

或者,如果你想添加一些額外的斷言:

int length() 
{ 
    const int str_length = strlen(something); 
    assert(str_length >= 0); 
    return str_length; 
} 

除此之外,它是所有關於你覺得什麼是最合適的

+1

你忘了'const'! –

2

我永遠不會爲你的第二個例子,因爲初始化,然後分配只是佔用的空間沒有理由。

可能做的是以下幾點:

int length() 
{ 
    const int str_length = strlen(arbitrary_string); 
    return str_length; 
} 

這是出於兩個原因:

  1. 你讓你的編譯器進行命名返回值優化;和
  2. 您的返回值現在憑藉一個名稱自行記錄。

然而,這更多的是默認規則爲我的。

在這個特定的,實際情況:

  1. 你的返回類型只是一個微不足道的小int,所以命名返回值優化,無論如何都不會允許的,並且是即使它在很大程度上是沒有意義的;和
  2. 這個函數已經很簡單了,並且命名得當。

所以我會用第一個例子:

int length() 
{ 
    return strlen(arbitrary_string); 
} 
+2

另一個優點是:在返回代碼之前,您可以看到代碼生成的值,從而使調試更容易。 –

+2

實例2是否會阻止NRVO? 「在具有類返回類型的函數的返回語句中,當表達式是具有與函數返回類型相同的cv非限定類型的非易失性自動對象(除函數或catch-clause參數之外)的名稱中,複製/移動操作可以通過構建 自動對象直接進入函數的返回值可以省略」 –

+0

@Lightness是您的第二代碼更加優化然後第一一個或兩個相同。 ? – Arpit

1

我說總是與例1去它讀取更加好聽。如果中間變量名稱輔助可讀性或者表達式應該被拆分成多個語句,我將永遠不會把表達式放在return語句中。

儘管如此,我絕對不會建議示例2,但初始化爲0毫無意義。中庸之道是更好:

int length() 
{ 
    int str_length = strlen(random_string); 
    return str_length; 
} 

但是,很顯然,str_length不會告訴你任何比函數名strlen做更多。

-1

在大多數情況下,可讀性總是勝過性能。如果你有性能關鍵的代碼,那麼去表現。但是,這是一個例外,而不是規則。

總是爲了便於閱讀。

+0

總是爲了可讀性而行,但是這個例子中的第一個實際上具有更好的可讀性。當然,我不會返回300字符線來贏得一些空間。 –

0

在一般的代碼應該是易於閱讀和做的目的明確。在你的例子中,我更喜歡較短的版本。長版本的語義沒有額外的信息獲取。

一如往常也有例外。特別是當返回值由一個長而複雜的表達式引起時。然後命名一些中間結果可能會有所幫助。

0

要回答這個問題ALW [除非你當然有嚴格的編碼標準可循,!] ays選擇更易於閱讀的解決方案,這在每種編程語言中都很重要,但在C++中它非常重要。

對於特定的問題最容易讀的C++開發人員選項號1,它是乾淨和簡單。但如果它發生,你必須寫一行是這樣的:

return (classA *)(function1(data1)->function2())->function3(); 

在這種情況下,永諾選擇分割線,因爲即使你明白是什麼,現在呢,你可以有一個困難時期弄清楚未來會發生什麼。

希望它有幫助

+1

這個不好的例子對調試來說也很糟糕,主要是因爲調試器傾向於「線」(主要是)「思考」,例如我還沒有看到一個調試器,你可以在一行的中間放置一個斷點。 –