开关中错误的多个案例不会产生编译器错误

这个问题在这里已经有了答案:

  • 逗号运算符在switch语句中的含义是什么? 6个答案

  • 只要快速查看此代码,我们认为返回值应为1,

    我想说的是有经验的C ++开发人员会立即发现,什么是错的,并很快得出结论,其他一些程序员不小心用逗号: ,

    但在执行过程中它返回3。

    不,代码不能编译 ,因为case表达式不是常量

    事实上,它不会在任何半路现代编译器中编译。 例如,MSVC 2013说:

    stackoverflow.cpp(8) : error C2051: case expression not constant
    stackoverflow.cpp(10) : error C2051: case expression not constant
    

    1, 2这样的表达式是逗号运算符的应用程序,并且逗号运算符暗示该表达式不是编译时常量。

    至少在C ++ 11出现之前,放宽了规则,即添加括号(即case (1, 2): :)将被允许编译。 它只是不会做你期望的。

    这在开关中的多个案例中部分回答:

    怎么会这样? 其他问题和答案几乎完全是关于C#,而不是关于C ++。

    我想知道为什么不正确的窗体编译时没有错误或事件警告(至少在Borland C ++编译器中)。

    因为编译器太旧了。 最好换个新的。


    我的猜测是,在第一种情况下,编译器评估逗号运算符以导致代码被执行,如下所示:

    switch(variable)
    {
      case 2:
        return 1;
      case 4:
        return 2;
      default:
        return 3;
    }
    

    从上面可以看出为什么值3返回输入1.我建议你阅读一下逗号操作符。 与它有关的SO有一些优秀的线索。


    a, b在C和C ++中都是有效的表达式。 它的意思是“评估a ,放弃它,评估b ”。 表达式的值是b 。 所以你原来的switch有以下含义:

    variable = 1;
    switch(variable)
    {
      case 2:
        return 1;
      case 4:
        return 2;
      default:
        return 3;
    }
    

    有关逗号运算符的更多信息,请参阅Wikipedia文章。

    链接地址: http://www.djcxy.com/p/84457.html

    上一篇: Incorrect Multiple Cases in Switch not generating compiler error

    下一篇: How to handle multiple values inside one case?