2017-07-06 56 views
-5

說法是有辦法縮短的 if聲明是這樣的: 如果縮短與相同條件

if(x == 1 && y == 1 && z == 1) -> if((x && y && z) == 1) or if((x,y,z) == 1)

編輯:很抱歉給您帶來不便。我的手機上速度快嗎?這裏是一個完整的例子:

這是我的連連看遊戲的一部分。

bool checkwin(string player) { 
    for (int i = 0; i<10; i++) { 
     for (int j = 0; j<10; j++) { 
      if (grid[i][j] == player && grid[i + 1][j] == player && grid[i + 2][j] == player && grid[i + 3][j] == player) { 
       return 1; 
      } 
      if (grid[i][j] == player && grid[i][j + 1] == player && grid[i][j + 2] == player && grid[i][j + 3] == player) { 
       return 1; 
      } 

      if (grid[i][j] == player && grid[i + 1][j + 1] == player && grid[i + 2][j + 2] == player && grid[i + 3][j + 3] == player) { 
       return 1; 
      } 

      if (grid[i][j] == player && grid[i - 1][j + 1] == player && grid[i - 2][j + 2] == player && grid[i - 3][j + 3] == player) { 
       return 1; 
      } 
     } 
    } 
} 
+7

關注使你的代碼可讀。讓編譯器優化代碼。 –

+0

@ThomasMatthews說什麼,讓您的代碼易於閱讀。當你使用像'x','y'和'z'這樣的變量名時,這已經是個問題了。 –

+0

下一次甚至不要試圖彌補自己的語義。你寫了(假設它們是整數)'x!= 0 && y!= 0 && z!= 0'和'z == 1',這有點不同...... – LogicStuff

回答

-3

如果你有存儲在數組中的int數據,你可以做一個包括檢查,並作出if語句的單一條件。

+1

Whaaaaaaa呵呵?? –

+0

例如,在Ruby中,如果[1,2,3] .include?(輸入)執行...結束,您可以執行此操作。只是用Ruby來說明這一點。我無法想象這是優於連續&&,但會要求它已經在一個數組中。 –

+0

@broken_historian因此,除了描述之外,您爲什麼只提供代碼的模糊描述,而不是實際示例?否則很難理解你的答案。 –

2

其實,如果你使用C++11或更高版本,你可以做一些縮短:

#include <iostream> 
#include <string> 
#include <tuple> 

int main() { 
    int x = 1; 
    std::string y = "Hello"; 
    double z = 3.14; 

    if(std::make_tuple(x, y, z) == std::make_tuple(1, "Hello", 3.14)) 
     std::cout << "Everything is okay." << std::endl; 
    else 
     std::cout << "Something went wrong." << std::endl; 

    return 0; 
} 

或者爲你的情況(如果您的變量的類型是int):

if(std::vector<int> { x, y, z } == std::vector<int> { 1, 1, 1 }) 
    std::cout << "Everything is okay." << std::endl; 
else 
    std::cout << "Something went wrong." << std::endl; 

但是要記住,這些當您必須一次測試多個輸入時,或者您必須爲您的類型過載comparison operators時,技術會變得非常方便。在你的例子中(正如評論所指出的那樣),這是不必要的,x == 1 && y == 1 && z == 1是微不足道的。


後您編輯你的問題很明顯,你打算在比較中使用對象(std::string)。在這種情況下,每次進行比較時將它們複製到std::tuple或數組中會發生嚴重的性能下降。

爲了不使一個顯著的開銷相比,你if語句中的表達式,你可以使用variadic templates喜歡如下:

template<typename T, typename... Args> 
bool equalToAll(T&& test, Args&&... args) { 
    bool result = true; 
    bool dummy[] { false, (result &= (test == args))... }; 
    return (static_cast<void>(dummy), result); 
} 

// Usage: 
// equalToAll(player, grid[i][j], grid[i + 1][j], grid[i + 2][j], grid[i + 3][j]) 

這個例子執行參數包擴展與列表初始化代表你可以閱讀更多herehere

1

如果要檢查所有的變量都彼此相等,你可以寫這樣的幫手

template <typename T> 
bool all_equal(const std::initializer_list<T>& l) { 
    return std::equal(l.begin() + 1, l.end(), l.begin()); 
} 

用法:

if (all_equal({a, b, c})) 

在線版本:http://ideone.com/8OC1yq