簡體   English   中英

如何正確縮短C ++中的if語句?

[英]How to correctly shorten an if-statement in C++?

好的,我有一個if語句,在其中多次比較特定值。 我敢打賭,有一種更短的方法可以做到這一點:

if(letter == "%" || letter == "+" || letter == "-" || letter == "!")

我嘗試將其編寫為:

if(letter == "%" || "+" || "-" || "!")

但是它工作不正確。

這樣的事情可能會起作用:

string s("%+-!");
if (s.find(letter) != string::npos) { ... } 

那是盡可能的短。 您可以重寫它,但是在Boost的幫助下

if( boost::is_any_of( "%+-!" )( letter ) )

嘗試使用switch語句代替if。 它的鍵入次數不少,但確實允許您只寫一次“字母”。 一些程序員喜歡switch語句的視覺布局。 注意,switch僅適用於char等標量類型(不適用於std :: string)。

switch (letter)
{
  case '%':
  case '+':
  case '-':
  case '!':
     // if letter is %,+,-,!
     // code goes here for matching letter 
     break;
  default:
     // else do something different
     // code goes here for letter that doesn't match
}

有關類似的示例,請參見頁面底部的http://www.cplusplus.com/doc/tutorial/control/

char op[4] = { '%', '+', '-', '!' };
char * opEnd(op + 4);
if (opEnd != find(op, opEnd, letter))

或者:

if (string("%+-!").find(letter) != string::npos)

問題是||兩側 操作員之間互不了解。 它們是兩個完全獨立的表達式。 因此, "+"等總是評估為true(想想如果您只寫if ("+")會發生什么-它會衰減為非NULL的指針)

有時,我發現使用std::find和成對的迭代器來表達這種問題比較干凈:

#include <iostream>
#include <algorithm>

void test(const char letter) {
  static const char c[] = {'%', '+', '-', '!'};
  static const char *begin=c, *end=&c[sizeof(c)/sizeof(*c)];
  if (std::find(begin, end, letter) != end) {
    std::cout << "Matched " << letter << std::endl;
  }
}

int main() {
  test('a');
  test('%');
  test('!');
}

我猜最終結果是鍵入盡可能少的內容,並嘗試通過使用諸如英語之類的熟悉內容來使您的代碼快速理解。

您的代碼讀起來像是“我的信等於此,此,此,此”。 可能會花很多時間,但是理解起來卻很快。

不幸的是,c ++編譯器並沒有真正做到“我的信等於這些”。 對於我們大多數人來說,這可能是英語,但對於差勁的編譯器而言不是:)

作為程序員,您有能力隱藏編譯器讀寫能力的不足,使您的代碼易於理解,而且鍵入更少。

 if( letterIsOneOfThese( letter, "%+-!") )
 {
    // do something

 }


bool letterIsOneOfThese( const char letter, const char* letterList ) 
{
    int len = strlen( letterList );
    while( len-- )
    {
        if( letterList[len] == letter )
        {
            return true;
        }
    }

    return false;

}

暫無
暫無

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

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