在C ++中添加布尔表达式switch语句?

时间:2014-09-12 17:47:36

标签: c++ boolean case break boolean-expression

我正在用C ++练习switch语句,我想知道我是否可以添加一个布尔表达式以及如何,就像它是if / else对应物一样。是否可以加入这个?

这是我的骨架代码:

#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;
}

7 个答案:

答案 0 :(得分:5)

您无法直接使用交换机中的条件,因为它们需要编译时常量表达式。在任何情况下,您的方法都缺少精确值的任何分支(例如HouseValue == 100000)并且它是多余的。

最简单的解决方案是使用if/else链:

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

答案 1 :(得分: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 {
   ...
}

答案 2 :(得分: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标签是常量,您就有很大的空间摆动。

祝你好运。

答案 3 :(得分:1)

不,它不能那样做。

switch声明并没有作为单纯的语法糖而被引入语言中#34;对于链式ifswitch语句专门用于为参数化的goto&#34;提供更好的结构化替换。功能,即具有运行时跳转目标的goto,可以立即从参数值导出。 switch必须始终立即知道要跳到哪里。这就是switch声明背后的整个想法。你的条件不符合这个想法。 (在第二个想法,他们有点做,但他们仍然是#34;太复杂&#34;原来的switch标准。)

您要做的是通过链式if实施。如果你不喜欢它,你可以发明一些东西,比如某种范围集合可以有效地从给定的HouseValue生成整数范围索引(1,2,3等)。您将能够对该索引执行switch。 (见@ WhozCraig的答案。)

当然,由于您的HouseValue是一个整数,您可以使用包含所有可能的switch值的案例标签来HouseValue,但除了纯粹的幽默之外,这几乎没有价值

还应该注意的是,一些编译器(例如GCC)支持&#34;范围&#34; swicth语句中的案例标签,例如

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

但这是一种非标准的语言扩展。

答案 4 :(得分: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 ......

答案 5 :(得分: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;
  }
}

答案 6 :(得分: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 */
}

通过这种方式,您可以针对单个int分区和跳转交换5个if语句的(可能)评估。测量更快的用例。