我正在用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;
}
答案 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;对于链式if
。 switch
语句专门用于为参数化的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语句的(可能)评估。测量更快的用例。