[英]Use switch cases in an if statement
我们可以使用条件在 switch 语句中包含 case 吗?
我的代码:
switch(menu_option)
{
if (g_logged_in)
{
case 'L':
cout << "Login Menu\n";
break;
case 'S':
cout << "Signup Menu\n";
break;
}
case 'A':
foo();
break;
case 'B':
bar();
break;
default:
cout << "Invalid Option!\n";
}
当我编译文件时,我收到一个错误
[pewpew@Sierra cpp-something]$ c++ src/main.cc -o main.out
src/main.cc: In function 'int main()':
src/main.cc:53:13: warning: statement will never be executed [-Wswitch-unreachable]
53 | if (g_logged_in)
| ^~
完全不可能吗?
目前,程序控制永远不会到达if (g_logged_in)
,所以它永远不会被评估。 您有用的编译器发出警告。
实际上,虽然switch
块只不过是一组受控的goto
语句。 你可以强迫它
switch(menu_option){
foo:
if (g_logged_in){
带有goto foo;
程序控制到达的地方,尽管由于可读性和可维护性,这种想法是不明智的。 以下代码片段是“Hello World!”的重新表述。 程序:
#include <iostream>
int main(){
switch (1){
foo:
if (true){
case 0:
std::cout << " World!\n";
break;
case 1:
std::cout << "Hello";
goto foo;
}
}
}
有关switch
块内交错控制循环的实际用例,请参阅 Duff 的设备: https : //en.wikipedia.org/wiki/Duff%27s_device
您的代码上方没有“案例”。 你不能这样做。 这种情况很可能被编译成一条 CPU 指令,该指令仅适用于整数。 您必须使用 case 并对两种情况执行 if() 两次。
您不能有条件地指定case
语句。 你将不得不做更多这样的事情:
switch (menu_option)
{
case 'L':
// in C++17 and later, you can uncomment the following
// attribute to avoid a compiler warning...
//
// [[fallthrough]];
case 'S':
if (g_logged_in)
{
if (menu_option == 'L')
cout << "Login Menu\n";
else
cout << "Signup Menu\n";
}
else
cout << "Invalid Option!\n";
break;
case 'A':
foo();
break;
case 'B':
bar();
break;
default:
cout << "Invalid Option!\n";
break;
}
或这个:
switch (menu_option)
{
case 'A':
foo();
break;
case 'B':
bar();
break;
default:
if (g_logged_in)
{
if (menu_option == 'L')
{
cout << "Login Menu\n";
break;
}
if (menu_option == 'S')
{
cout << "Signup Menu\n";
break;
}
}
cout << "Invalid Option!\n";
break;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.