2010-12-20 136 views
22

我可以俯瞰東西,但有一個簡單的方法在C++來組病例在一起,而不是分別寫出來的?我記得在我基本也只是做:將開關語句組合在一起?

SELECT CASE Answer 
CASE 1, 2, 3, 4 

實例C++(對於那些需要它):

#include <iostream.h> 
#include <stdio.h> 
int main() 
{ 
    int Answer; 
    cout << "How many cars do you have?"; 
    cin >> Answer; 
    switch (Answer)          
     { 
     case 1: 
     case 2: 
     case 3: 
     case 4: 
     cout << "You need more cars. "; 
     break;           
     case 5: 
     case 6: 
     case 7: 
     case 8: 
     cout << "Now you need a house. "; 
     break;           
     default: 
     cout << "What are you? A peace-loving hippie freak? "; 
     } 
     cout << "\nPress ENTER to continue... " << endl; 
     getchar(); 
     return 0; 
} 
+13

嗯,我認爲你回答了你自己的問題... – Falmarri 2010-12-20 21:35:17

+1

對於你提供了一個更簡單的方法的特定例子是'if(Answer> = 1 && Answer <= 4)' – Mikhail 2010-12-20 21:36:37

+1

@Falmari不,他想要更多緊湊的形式,如'情況1,2,3,4:' – marcog 2010-12-20 21:39:46

回答

10

沒有,但你可以用if - else if - 它實現了相同的結果else鏈:

if (answer >= 1 && answer <= 4) 
    cout << "You need more cars."; 
else if (answer <= 8) 
    cout << "Now you need a house."; 
else 
    cout << "What are you? A peace-loving hippie freak?"; 

您可能還需要處理的0汽車的情況下,然後也有負面的意外情況可能通過拋出異常的汽車數量。

附註:我已將Answer更名爲answer,因爲它被認爲是以大寫字母開始變量的錯誤樣式。

作爲一個側面說明,腳本語言如Python允許不錯if answer in [1, 2, 3, 4]語法這是實現你想要什麼的靈活方式。

+0

它很糟糕,關係運算符不能在switch語句中使用......: - \ – 2010-12-20 21:49:24

+2

@Josh您是如何連接到switch語句的?如果他們沒有提供你需要的東西,可以使用更合適的選擇。 – marcog 2010-12-20 21:51:08

+0

沒什麼。我剛剛閱讀了關於分支語句的文章,並注意到他們花了很多時間在他們身上,出於某種原因,我認爲還有另一種方法來分組他們。我真的只在開始編程時才使用開關語句。 – 2010-12-20 21:55:59

3

你舉的例子是簡潔的,因爲它與switch結構得到。

19

AFAIK所有你能做的就是忽略的回報讓事情在C++更緊湊:(你可以刪除其他收益爲好,當然)

switch(Answer) 
{ 
    case 1: case 2: case 3: case 4: 
     cout << "You need more cars."; 
     break; 
    ... 
} 

+1

你需要'case'和數字之間的空格嗎? – marcog 2010-12-20 21:37:46

+0

@marcog,是!修正它,注意到ta。 – 2010-12-20 21:42:17

+0

這打敗了我的目的。 – 2010-12-20 21:43:10

0

不,除非你要打破兼容性你的編譯器支持它。

5

無法刪除關鍵字case。但是你的例子可以這樣寫短:

switch ((Answer - 1)/4)          
{ 
    case 0: 
     cout << "You need more cars."; 
     break;           
    case 1: 
     cout << "Now you need a house."; 
     break;           
    default: 
     cout << "What are you? A peace-loving hippie freak?"; 
} 
+0

我實際上喜歡這個想法。謝謝! – 2010-12-20 21:44:38

+4

不是很靈活,我討厭遇到此代碼。 – marcog 2010-12-20 21:46:15

+0

它確實是仍然使用switch語句的唯一方法,而不必定義每種情況。 – 2010-12-20 21:50:35

1

GCC有一個所謂的「受案範圍」擴展名:

http://gcc.gnu.org/onlinedocs/gcc-4.2.4/gcc/Case-Ranges.html#Case-Ranges

我時我只使用gcc來使用它。沒有什麼可以說的 - 它確實是你想要的東西,儘管只是針對範圍的值。

這個最大的問題是,只有GCC支持它;這可能會或可能不會成爲您的問題。

(我懷疑你的例如if聲明將是一個更加天作之合。)

1

你可以使用這樣的:

case 4: case 2: 
{ 
    //code ... 
} 

對於使用4或2個開關的情況。

1

如果你願意去預處理器濫用的方式,Boost.Preprocessor可以幫助你。

#include <boost/preprocessor/seq/for_each.hpp> 

    #define CASE_case(ign, ign2, n) case n: 

    #define CASES(seq) \ 
     BOOST_PP_SEQ_FOR_EACH(CASE_case, ~, seq) 

    CASES((1)(3)(15)(13)) 

通過gcc-E -P運行這個只運行預處理器的CASES的膨脹使得:

case 1: case 3: case 15: case 13: 

注意,這可能會無法通過代碼審查(不,我的工作!),所以我建議它受限於個人使用。

它也應該能夠創建一個CASE_RANGE(1,5)宏擴展到

case 1: case 2: case 3: case 4: case 5: 

爲你。

6

當然可以。

您可以使用情況X ... Y的範圍

例子:

#include <iostream.h> 
#include <stdio.h> 
int main() 
{ 
    int Answer; 
    cout << "How many cars do you have?"; 
    cin >> Answer; 
    switch (Answer)          
     { 
     case 1 ... 4: 
     cout << "You need more cars. "; 
     break;           
     case 5 ... 8: 
     cout << "Now you need a house. "; 
     break;           
     default: 
     cout << "What are you? A peace-loving hippie freak? "; 
     } 
     cout << "\nPress ENTER to continue... " << endl; 
     getchar(); 
     return 0; 
} 

讓你的編譯器中啓用確保您有 「-std =的C++ 0x」 標誌