C++:在 switch 语句中使用多个条件

C++: Using multiple conditions in switch statements

我正在学习 C++ 编程 class,我需要有关嵌套 switch 语句和使用多个条件的帮助,因为我必须将我已经编写的程序从 if/else 语句转换为 switch 语句,因为我不知道我应该使用 switch 语句。

例如,我该如何更改:

if (temperature >= -459 && temperature <= -327)
{
    cout << "Ethyl Alcohol will freeze.\n";
}
else if (temperature >= -326 && temperature <= -30)
{
    cout << "Water will freeze.\n";
}
else if ...
{
}
else 
{
}

进入switch/case语句?能拿到第一层,但是像上面的温度语句一样嵌套和有多个条件怎么办?

首先,这个问题是用C而不是C++。 C++继承了大部分C语言,包括switch-case。

你不能用开关来做到这一点,除非你开始一个一个地枚举所有的值,就像这样:

switch (temperature) {
   case -459:
   case -458:
   ....
   case -327: <do something>; break;
   case -326:
   .....
}

这是因为在 C 中,switch-case 被简单地转换为一系列 if-goto 语句,而 cases 只是标签。

在你的情况下,你卡在了 if-else-if 梯子上。

您可以使用包含温度和要打印的文本的查找 table:

struct Temperature_Entry
{
  int min_temp;
  int max_temp;
  const char * text_for_output;
};
static const Temperature_Entry temp_table[] =
{
  {-459, -327, "Ethyl Alcohol will freeze.\n"},
  {-326, -30,  "Water will freeze.\n"},
};
static const unsigned int entry_count =
  sizeof(temp_table) / sizeof(temp_table[0]);

//...
int temperature;
for (unsigned int i = 0; i < entry_count; ++i)
{
  if (   (temperature >= temp_table[i].min_temp)
      && (temperature < temp_table[i].max_temp))
  {
    std::cout << temp-table[i].text_for_output;
  }
}

正如许多人指出的那样,您不能对范围和动态公式使用 switch case。因此,如果您无论如何都想使用它们,则必须编写一个函数,该函数需要一个温度和 returns 一个超出一组已知温度范围的温度范围。然后,最后,您可以使用 switch/case 作为温度范围。

enum TemperatureRange { FrigginCold, UtterlyCold, ChillinglyCold, Frosty, ... };
TemperatureRange GetRange( int temperature );

// ...
switch( GetRange( temperature ) )
{
case FrigginCold: cout << "The eskimos vodka freezes."; break;
case UtterlyCold: cout << "The eskimo starts to dress."; break;
// ...
}

Switch 语句的工作方式如下:

int variable = 123; // or any other value

switch (variable)
{
  case 1:
    {
        // some code for the value 1

        break;
    }
  case 12:
    {
        // some code for the value 12

        break;
    }
  case 123:
    {
        // some code for the value 123

        break;
    }
  case 1234:
    {
        // some code for the value 1234

        break;
    }
  case 12345:
    {
        // some code for the value 12345

        break;
    }
  default:
    {
        // if needed, some code for any other value

        break;
    }
}