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