2014-09-12 41 views
2

我在C++中練習switch語句,我想知道是否可以添加一個布爾表達式以及如何像if/else對應。這是否可以納入?在C++中添加布爾表達式switch語句?

這裏是我的骨架代碼:

#include "stdafx.h" 
#include <iostream> 
#include <iomanip> 
#include <cmath> 
#include <string> 
#include <Windows.h> 
#include <stdlib.h> 
#include <time.h> 
#include <random> 

using namespace std; 


int main() 
{ 
    int HouseValue; 
    cout << "Enter your total house value estimate:"; 
    cin >> HouseValue; 

    switch (HouseValue) 
    { 
     case 1: 
      (HouseValue < 100000 && HouseValue > 50000); 
      cout << ""; 
      break; 
     case 2: 
      (HouseValue < 250000 && HouseValue > 100000); 
      cout << ""; 
      break; 
     case 3: 
      (HouseValue < 500000 && HouseValue > 250000); 
      cout << ""; 
      break; 
     case 4: 
      (HouseValue < 1000000 && HouseValue > 500000); 
      cout << ""; 
      break; 
     case 5: 
      (HouseValue < 3000000 && HouseValue > 1000000); 
      cout << ""; 
      break; 
    } 
    return 0; 
} 
+2

在編譯時必須知道case表達式。 – 2014-09-12 17:49:45

+0

我之前添加過,但是我的妹妹說這不可能,所以我刪除了它們,並且它們正在扮演越野車。 – Chantola 2014-09-12 17:51:00

+1

@Chantola即使他們在那裏,他們在這段代碼中也沒用。例如,'case 1:'的開關已經確定'HouseValue'是...好的,'1'。測試它在50000到100000之間是沒有意義的,因爲它顯然不是(它** ** 1 **)。 – WhozCraig 2014-09-12 17:52:35

回答

5

不能直接使用條件的開關,因爲它們需要一個編譯時間常數表達式。在任何情況下,你的方法都缺乏精確值的任何分支(例如,HouseValue == 100000),這是多餘的。

最簡單的解決方案是使用一個if/else鏈:

if (HouseValue < 50000) 
    ... 
else if (HouseValue < 100000) 
    ... 
else if (HouseValue < 250000) 
    ... 
else if (HouseValue < 500000) 
    ... 
1

號C++不具有這種開關結構的:switch僅與常量使用。

C++實現爲控制結構

if (HouseValue >= 50000 && HouseValue < 100000) { 
    ... 
} else if (HouseValue >= 100000 && HouseValue < 150000) { 
    ... 
} else if (HouseValue >= 150000 && HouseValue < 200000) { 
    ... 
} else { 
    ... 
} 

,或者簡化位

if (HouseValue >= 50000 && HouseValue < 100000) { 
    ... 
} else if (HouseValue < 150000) { 
    ... 
} else if (HouseValue < 200000) { 
    ... 
} else { 
    ... 
} 
1

演繹你的情況下的值時,您可以發揮創意與switch() EVAL的值。例如:

switch((HouseValue + 50000)/50000) 

將導致因integer division潛在結果如下表所示:

HouseValue (N)   (HouseValue + 50000)/50000 
=================================================== 
0  <= N < 50000     1 
50000 <= N < 100000     2 
100000 <= N < 150000     3 
etc... 

我不會破壞搞清楚的樂趣是什麼值的公式中使用,以獲得您正在尋找的特定範圍(或者甚至可能)。我會告訴你的。請記住,如果您沒有提供break,那麼提到有關「穿過」特定案例標籤的問題?是的,這可能會派上用場。

總之,沒有人說你必須直接在switch上輸入值。您始終可以使用基於您的輸入值的表達式,只要case標籤是常量,就有很大的擺動空間。

祝你好運。

1

不,不能這樣做。

switch聲明沒有被引入語言中,僅僅作爲鏈接的if的「語法糖」。 switch語句是專門爲「參數化跳轉」功能提供更好結構的替換,即具有運行時跳轉目標的goto,它可立即從參數值派生。 switch必須立即知道跳到哪裏。這是switch聲明背後的全部想法。你的條件不符合這個想法。 (關於第二個想法,他們還是應該這樣做,但仍然是原來的switch標準「太複雜」。)

您試圖執行的操作是通過鏈接if實現的。如果你不喜歡它,你可以發明別的東西,比如某種可以有效生成整數範圍索引的範圍集合(1,2,3等)。)從給定HouseValue。您將能夠在該索引上執行switch。 (請參見@ WhozCraig的答案。)

當然,因爲你的HouseValue是一個整數,你可以做,涵蓋所有可能的HouseValue值case標籤一個switch,但這純粹除了幽默一個幾乎沒有任何價值。

還應當指出的是,一些編譯器(GCC,對於一個例子)支持swicth聲明「遠程」標籤的情況下,像

switch (HouseValue) 
{ 
    case 50000 ... 100000: 
     ... 
     break; 
    case 100000 ... 250000: 
     ... 
     break; 
    ... 
} 

但這是一個非標準語言擴展。

1

下面是另一種解決方案,只要插入ValueBracket(HouseValue)在開關代替

static const std::array<int, 6> Values = { 50000, 100000, 250000, 500000, 1000000, 3000001 }; 
size_t ValueBracket(int value) { 
    return std::lower_bound(Values.begin(), Values.end(), value) - Values.begin(); 
} 

並添加以下2殼體

case 0: 
    cout << "you live in a shed peasant, go away"; 
    break; 
default: 
    cout << "sorry my Lord, we can't sell your castle here"; 
    break; 

的精神病情況

constexpr int Return1() { 
    return 1; 
} 


switch(index) { 
case Return1(): 
     break; 
} 

這也可能只是是GCC,很開心......

但是case只能編譯時間常量,比如constexpr ...

1

另一種解決方案:帶函數指針的查找表。

typedef void (*Ptr_Processing_Function)(void); 

void Process_Range_1(void); 
void Process_Range_2(void); 
void Process_Range_3(void) 

struct Range_Entry 
{ 
    unsigned int lower_price; 
    unsigned int high_price; 
    Ptr_Processing_function process_function; 
}; 

const Range_Entry table[] = 
{ 
    {50000, 10000, Process_Range_1}, 
    {10000, 15000, Process_Range_2}, 
    //... 
}; 
const unsigned int entries_in_table = 
    sizeof(table)/sizeof(table[0]); 

//... 
cin >> price; 
for (unsigned int i = 0; i < entries_in_table; ++i) 
{ 
    if ((price >= table[i].lower_price) && (price < table[i].high_price)) 
    { 
    table[i].processing_function(); 
    break; 
    } 
} 
0

我知道我爲黨爲時已晚,但你可以把它變成像這樣的開關:

int mycase = HouseValue/50000; 

switch (mycase) { 
    case 0: /* HouseValue < 50000) */ 
    ... 
    case 1: /* HouseValue >= 50000 && HouseValue < 100000 */ 
    ... 
    case 2: /* HouseValue >= 100000 && HouseValue < 250000 */ 
    case 3: 
    case 4: 
    case 5: 
    ... 
    /* etc */ 
} 

這種方式,你如果對報表進行交易的5(可能的)評估一個int分區和一個跳轉。衡量哪個用例更快。