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;
}
}
我正在学习 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;
}
}