在C++中添加布尔表达式切换语句

Adding boolean expressions switch statements in C++?

本文关键字:语句 布尔表达式 添加 C++      更新时间:2023-10-16

我正在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除法和跳跃进行比较。测量您的用例中哪个更快。