簡體   English   中英

我應該在C ++中使用“int”或“bool”作為返回值嗎?

[英]Should I use “int” or “bool” as a return value in C++?

如果我有一個執行某些過程的函數然后需要返回某事的真值,那么使用布爾變量或int變量作為返回類型是否有令人信服的理由?

bool Foo()
{
  ...
  ...
  return truthValue;
}

int Foo()
{
  ...
  ...
  return truthValue;
}

這兩個功能之間有明顯的區別嗎? 這兩者有哪些潛在的缺陷和優勢?

謝謝,

NMR

如果它是一個真正的真值,那么你應該使用一個bool,因為它使調用者非常清楚將返回什么。 返回int時,可以將其視為代碼/枚舉類型值。

代碼應盡可能清晰明確,無論是函數名稱,參數名稱和類型,還是返回代碼的類型。 這提供了更多自我記錄的代碼,更易於維護的代碼,以及有人會誤解您“意味着什么”的可能性更低。

如果要返回二進制真值,則應使用布爾數據類型(如果可用)。

編譯器會在必要時對事物進行優化,您應該盡可能地編寫代碼以便清楚。 這樣,您或您的繼任者將毫無疑問地在軌道上走了五年。

使用bool - 它更清楚地傳達了代碼的語義含義。 如果另一個開發人員讀取您的代碼並看到bool的返回類型,他立即知道它返回一個真值。 相反,如果他看到它返回一個int ,他必須進一步挖掘並花費更多時間來確定函數的界面(例如閱讀文檔或閱讀代碼),這會減慢他的速度。

使用int的唯一原因是,如果您需要與遺留代碼接口和/或符合特定接口(例如,您的函數獲取其地址並傳遞給需要某個原型函數的第三方庫)。

有一點在現有答案中沒有得到足夠的重視:肯定使用bool,但為了獲得最大的好處,你只需要為你的bool變量和函數使用好名字。 我提到這個是因為truthValue是一個典型的可怕名字。 您的bool名稱應始終使您使用的約定顯而易見。 不要讓其他編碼器猜測bool變量的工作方式。 所以;

好名字

bool okay;
bool error;
bool success;
bool IsWidget();

壞名字

bool truthValue;
bool status;
bool result;
bool Widget();

你看到了區別? 誠然,你的真理價值可能比狀態或結果更好。 但基本上壞名稱會使代碼混亂;

// Bad
bool result = Func();
if( result )
{
   // Did Func() succeed or fail ? who knows
}

// Good
bool okay = Func();
if( okay )
{
   // Func() succeeded
}

使用bool的最大優點是語義。 如果我看到一個返回bool的函數,我知道它只會返回true或false,甚至沒有查看或者過於強調函數的名稱。 如果它返回一個int,我必須更加思考並仔細觀察該函數。

當你在它的時候(使用bool作為返回值,也就是這樣),也可以用這樣的方式命名你的bool返回函數,這樣就可以明顯地將true和false表示為返回值。 想想危險:以問題的形式陳述您的功能名稱。

有幾點需要考慮。 如果Foo可以從C調用,則不能返回bool因為C不知道什么是bool

int也可以返回truefalse以外的值。 根據Foo是否可以有其他有意義的返回值,這可能是好事還是壞事。 但是,如果可以,Foo返回enum值而不是int更有意義。

如果您沒有與C的兼容性作為要求,我會建議bool

bool過去只是一個宏...現在編譯器強制它只有0或1的值(除非它是未初始化的)。 我肯定會使用bool - 它是自我記錄的,除了bool之外你不需要任何東西。 保持簡單,具體。

如果truthValue是bool return bool。

這可以防止類型的錯誤(沒有大問題)。

另一個原因是傳統的是返回一個int來報告狀態,其中0表示成功,非零數字表示錯誤情況。 因此,從調用者的角度來看,以下內容將是無意義的:

int process()
{
   bool success = false
   if (the process was successful)
      success = trrue;
   return success;
};

通常,它應該是

bool process()
{
   bool success = false
   if (the process was successful)
      success = true;
   return success;
}

主要是:

int main()
{   return process() ? EXIT_SUCCESS : EXIT_FAILURE; }

要么

int process()
{
  int result = EXIT_FAILURE
  if (the process was successful)
    result = EXIT_SUCCESS
  return result;
};

主要是:

int main()
{ return process(); }

回復:陷阱。 int-as-bool的問題在於人們這樣做(有點人為,但你明白了):

typedef int BOOL
#define TRUE 1
#define FALSE 0

BOOL FDoSomething()
{
     // code code code
     return numTimesIDidSomething;
}

void Func()
{
     // code code code
     if(FDoSomething() == TRUE) // ERROR!
     {
          //etc
     }
}

如果numTimesIDidSomething大於1,那么這是一個錯誤。

這導致了兩件事,

  1. 要求你使用像boolVariable這樣的奇怪結構來“規范化”所有的ints-as-bools為TRUE
  2. C ++中專用bool類型的發明

只需使用bool。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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