在C++中添加布尔表达式切换语句
Adding boolean expressions switch statements in C++?
我正在C++中练习切换语句,我想知道是否可以添加一个布尔表达式以及如何添加,就像它是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;
}
不能直接在开关中使用条件,因为它们需要编译时常量表达式。在任何情况下,您的方法都缺少精确值的任何分支(例如HouseValue == 100000
),并且它是多余的。
最简单的解决方案是使用if/else
链:
if (HouseValue < 50000)
...
else if (HouseValue < 100000)
...
else if (HouseValue < 250000)
...
else if (HouseValue < 500000)
...
否。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 {
...
}
在推导案例值时,可以创造性地使用switch()
评估值。例如:
switch((HouseValue + 50000)/50000)
由于整数除法,将产生以下潜在结果表:
HouseValue (N) (HouseValue + 50000)/50000
===================================================
0 <= N < 50000 1
50000 <= N < 100000 2
100000 <= N < 150000 3
etc...
我不会破坏在等式中使用什么值来获得你想要的特定范围(或者如果可能的话)的乐趣。我会告诉你的。还记得上面提到的如果你不提供break
,那么从一个特定的案例标签到下一个案例标签的"失败"吗?是的,这可能会派上用场。
简而言之,没有人说你必须直接对switch
上的输入值。您可以始终使用基于输入值的表达式,只要case
标签是常量,您就有很大的回旋余地。
祝你好运。
不,不能那样做。
switch
语句并不是作为链式if
的"句法糖"而引入到语言中的。switch
语句是专门为"参数化goto"功能提供更好的结构替换而引入的,即具有运行时跳转目标的goto
,该目标可以立即从参数值中导出。switch
必须始终立即知道跳到哪里。这就是switch
声明背后的全部思想。你的条件不符合这个想法。(转念一想,它们有点像,但按照最初的switch
标准,它们仍然"太复杂"了。)
您试图做的是通过链式if
来实现的。如果你不喜欢它,你可以发明其他东西,比如某种范围集合,它可以有效地从给定的HouseValue
生成整数范围索引(1、2、3等)。您将能够对该索引执行switch
。(参见@WhozCraig的回答。)
当然,由于你的HouseValue
是一个整数,你可以用包含所有可能的HouseValue
值的大小写标签来做switch
,但这除了纯粹的幽默之外几乎没有任何价值。
还应该注意的是,一些编译器(例如GCC)支持swicth
语句中的"范围"大小写标签,如
switch (HouseValue)
{
case 50000 ... 100000:
...
break;
case 100000 ... 250000:
...
break;
...
}
但这是一个非标准的语言扩展。
另一个解决方案:带有函数指针的查找表。
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;
}
}
这里有另一个解决方案,只需将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;
}
这可能只是海湾合作委员会高兴。。。
但case只能是像constexpr这样的编译时常量。。。
我知道我来不及参加聚会了,但你可以把它变成这样的开关:
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 */
}
通过这种方式,您可以将5if语句的(可能的)求值与单个int除法和跳跃进行比较。测量您的用例中哪个更快。
- 提升精神:解析布尔表达式并简化为规范范式
- C++ : 为什么必须添加布尔表达式?
- 我的作业问题:布尔表达式
- 是否可以定义以后可以计算的布尔表达式
- 布尔表达式的值是什么
- 布尔表达式的奇怪评估
- 布尔表达式是否像使用 if 或 switch 进行分支一样繁琐?
- 无限模板递归,因为没有布尔表达式优化,只有 gcc
- 是否有任何合理的场景,程序员可能希望避免布尔表达式的短路计算
- 注 961:违反 MISRA 2004 咨询规则 12.6,运算符所需的布尔表达式:"!"
- 使用提升的布尔表达式
- 在C++上给定布尔表达式的情况下分配整数值
- 布尔表达式的精神解析器
- 多个布尔表达式,而不重新插入变量
- C++ 循环和布尔表达式
- 编写布尔表达式以判断列表是否在增加
- 解释 c++ 中语句和表达式之间的区别
- 布尔表达式习语中的字符串文字是什么
- C++Bare布尔表达式(不包含if、while或其他语句)
- 在C++中添加布尔表达式切换语句