2010-03-31 113 views
15

有誰知道是否可以在switch語句中包含一個範圍(如果是這樣,如何)?在C語言中切換語句

例如:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2..8: 
    //do something else 
    break; 
    default: 
    break; 
} 

編譯器似乎並不喜歡這種語法 - 它也不喜歡:

case <= 8: 

回答

23

不,這是不可能的。有幾個方法,我已經在過去做到了這一點:

固定編碼:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
    //do something else 
    break; 
    default: 
    break; 
} 

在組合與if {}聲明:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    default: 
    if (x <= 8) 
    { 
     // do something 
    } 
    else 
    { 
     // throw exception 
    } 
    break; 
} 
+2

+1。第一個讓我想傷害某人。 :) – 2010-03-31 12:13:17

+0

第一個例子看起來很奇怪:我知道它對於例如Java來說是對的,但對於'switch [MSDN entry](https://msdn.microsoft.com/zh-cn/library/06tc147t.aspx) '明確指出,編譯器不會允許「跌落」。或者我在這裏錯過了什麼? – Informagic 2016-07-01 12:13:18

+0

好的,顯然這是允許「空」的情況下。 – Informagic 2016-07-01 13:36:45

3

簡短的回答:沒有。可以在那裏編寫所有的情況,但是不支持這種範圍表示法。

我認爲你必須在這裏使用if陳述或者切換到那裏是情況descrimination提供更好的支持的語言。

2

如果你有那麼少數情況下,if會更喜歡。

1

你可以通過案件辦理情況的明確的情況下,如果你只有一個範圍,在默認情況下處理它。

-1

你可以做

case 2: 
case 3: 
case 4: 
... 
case 8: 
// code here 
break 
+0

[ - ]這個答案已經由Andy Shellam提供了。 – 2016-04-22 17:56:03

5

沒有,但你可以這樣寫,所以你至少避免// do something else部分多次寫。

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2: case 3: case 4: case 5: case 6: case 7: case 8: 
    //do something else 
    break; 
    default: 
    break; 
} 
+0

上面已經提到過,但關於格式化的重點:)我關心第二個示例的通信 – 2017-12-08 04:28:02

-1

您可以通過使用情況下掉落:

switch (x) 
{ 
    case 1: 
    //do something 
    break; 
    case 2: 
    case 3: 
    case 4: 
    case 5: 
    case 6: 
    case 7: 
    case 8: 
    //do something else 
    break; 
    default: 
    break; 
} 

但我只是使用,如果這樣。

+0

[ - ]這個答案已經由Andy Shellam提供。 – 2016-04-22 17:54:50

-1

你不能在一個開關的情況下使用任何條件語句。

如果要執行的代碼同線不同的選項,那麼你可以做一兩件事:

switch (i) 
      { 
       case 0: 
       case 1: 
       case 2: 
       case 3: 
        //do something here. 
        break; 
       default: 
        //do something here. 
        break; 
      } 
+0

[ - ]以上答案已經由Andy Shellam提供。 – 2016-04-22 17:56:57

2

一種可能是你的範圍轉換成整數。例如:

//assuming x>=9 or if (x <= 0) return; 
     switch((x+12)/7) 
     { case 1:Console.WriteLine("one"); 
       break; 
      case 2:Console.WriteLine("2 through 8 inclusive"); 
       break; 
      case 3:Console.WriteLine("9 through 15 inclusive"); 
       break; 
      default: Console.WriteLine("16 or more"); 
       break; 
     } 
0

雖然這是不可能的,當我最初問到這個問題,通過C#模式匹配的奇蹟,現在是(在C#7):

switch (i) 
{ 
    case var test when test <= 2: 
     Console.WriteLine("Less than 2"); 
     break; 

    case var test when test > 2 && test < 10: 
     Console.WriteLine("Between 2 and 10"); 
     break; 

    case var test when test >= 10: 
     Console.WriteLine("10 or more"); 
     break; 
} 

A blog post on the subject