繁体   English   中英

在 if 语句中使用 switch case

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM