【问题标题】:unrelated code in switch case, no compiler warning/errorswitch case 中不相关的代码,没有编译器警告/错误
【发布时间】:2019-11-15 06:08:20
【问题描述】:

我发现了一些非常特殊的代码,想知道为什么它可以编译。在switch 中放置了一些与任何case 无关的代码。见下文:

int main()
{   
    for ( auto i: { 1,2,3,4})
         {   

             switch ( i ) 
             {   
                 case 1:
                     std::cout << "1" << std::endl;
                     break;

                 case 2:
                     std::cout << "2" << std::endl;
                     break;

                     {
                         std::cout << "What is the sense of this part?" << std::endl;
                     }

                 case 3:
                     std::cout << "3" << std::endl;
                     break;

                 default:
                     std::cout << "default" << std::endl;
                     break;
             }
         }
}

gcc (8.3.1) 只抱怨警告:

main.cpp: In function 'int main()':
main.cpp:56:81: warning: this statement may fall through [-Wimplicit-fallthrough=]
                      std::cout << "What is the sense of this part?" << std::end
main.cpp:59:18: note: here
              case 3:

clang (7.0.1) 什么也没说,即使是 -pedantic -Wextra -Wall

我想知道为什么两个编译器都接受该代码。生成的可执行文件永远不会执行它,这是好事 :-)

是合法的c++代码吗?

【问题讨论】:

  • break; 可以出现在case 子句中的任何位置。您会发现它通常是有条件的(在if 子句中)因此它是法律代码。但是如果检测到 (a) 无法访问的代码或 (b) 可能导致失败的代码,gcc 可以发出诊断消息。
  • 无法访问的代码仍然是合法代码。
  • 代码没有问题。一般在项目的静态代码分析中会发现这些东西。

标签: c++ language-lawyer


【解决方案1】:

这是一个法律代码。您可以删除break 或将其放在case 中的任何位置。

break 语句,当在语句中遇到时退出开关 声明

【讨论】:

  • 不是break,是和任何case无关的代码块
  • @Klaus break 并不意味着案件已经结束。下一个案子进来的时候就结束了。
  • 还有什么? switch(...) ... case x: ... 喙;案例 y: ... 中断;打破还有什么意义?对不起,这让我很困惑!
  • @Klaus break 只是意味着退出开关。请参阅链接,其中有没有中断的示例。
  • 一个 switch 语句将检查每个 case 直到一个通过,然后无条件地执行后续代码行,直到 switch 块结束或break 语句被命中。语句的格式没有什么特别之处,会使中间的独立代码块非法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-30
  • 2016-01-29
  • 1970-01-01
  • 2011-03-03
  • 2018-02-16
  • 1970-01-01
相关资源
最近更新 更多