2016-07-01 105 views
-2
if(a=='b' && b=='b' && c=='b' ...) 

這是否是正確的方法?如何正確檢查多次陳述

我已經找到解決我的問題,但想知道未來的時代如何做到這一點

+4

什麼是你想做?驗證所有這些變量是否等於「b」?你做這件事的方式並沒有什麼不同。就個人而言,我會將支票封裝在parens中,即使它們不是絕對必要的,例如:'((a =='b')&&(b =='b')&& ...)'。 – Frecklefoot

+0

但是,如果您可以選擇將所有這些變量放入某種類型的集合中,則可以對它們進行迭代,這將使代碼更易於維護。 – Frecklefoot

+1

_「我已經找到了解決我的問題的其他方法,但想知道未來如何做到這一點」_因此,您應該在第一名的答案中記錄這一點。 –

回答

3

如果你所有的只是離散變量,那麼你就必須這樣做檢查這樣其他的方式。

有你要考慮,雖然幾件事情:

這是不好的做法,繼續使用'b'一遍又一遍又一遍。將其分配爲一個常量或者將所有其他變量與第一個變量進行比較,以便如果需要將'b'更改爲'c',則只需在代碼中執行一次即可。

if(a=='b' && a == b && a == c && a == d/*...*/) 

此外,這仍然是很多代碼來維護。取決於鏈條的運行時間(你會上升到a==g && a==h && a == i還是更遠?)您可能想要將這些變量包裝到vector並反覆檢查它們。

bool equal = std::find_if_not(
    characters.begin(), characters.end(), 
    [](const char & c) {return c == 'b';} 
    ) == characters.end(); 
+0

如果您打算把感興趣的字符放在容器中,那麼你應該考慮使用'std :: find'。你也可以考慮使用'std :: string'並使用它的find成員函數。 –

+0

@JamesAdkison我不會推薦使用'std :: string',只是因爲它混淆了容器的用途。 OP指的是離散字符,對於這種情況,'std :: vector'比'std :: string'更能傳達容器的目的。 – Xirema

+0

+1,關於'std :: string'的公平點。也可以考慮使用'std :: set'或'std :: unordered_set'來避免線性搜索(如果這可能成爲問題)。 –

0

你的方式看起來不錯。一些編碼標準需要額外的括號像這樣

if((a=='b') && (b=='b') && (c=='b') ...) 

我個人不認爲這是必要的,如果你知道你的運算符優先級。請參閱http://www.cppreference.com並搜索優先順序。

2

,如果你想要一個簡潔的方式來描述意圖那就有點對模板功能可以幫助您:

template<class X, class Y> 
bool all_equal(X&& x, Y&& y) 
{ 
    return (x == y); 
} 

template<class X, class Y, class...Rest> 
bool all_equal(X&& x, Y&& y, Rest&&...rest) 
{ 
    return all_equal(std::forward<X>(x), std::forward<Y>(y)) 
    && all_equal(x, std::forward<Rest>(rest)...); 
} 

,讓這樣的代碼:

int main() 
{ 
    int a = 10; 
    int b = 10; 
    int c = 10; 
    int d = 11; 

    std::cout << std::boolalpha << all_equal(a, b) << std::endl; 
    std::cout << std::boolalpha << all_equal(a, b, c) << std::endl; 
    std::cout << std::boolalpha << all_equal(a, b, c, d) << std::endl; 
}