在switch语句中声明变量

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

  • 为什么不能在switch语句中声明变量? 23个答案

  • 如果根据语言的语法进行操作,您实际上可以在交换机中声明变量。 你得到一个错误,因为“ case 0: ”是一个标签,并在C中,它是非法的声明作为标签后的第一条语句-注意,编译器期望的表达 ,如方法调用,正常分配,等等(虽然它可能是奇怪的,但这是规则。)

    当你首先放置NSLog()时,你避免了这个限制。 您可以将案例的内容放在{}括号中以引入范围区块,也可以将变量声明移到开关外部。 你选择的是个人喜好的问题。 请注意,在{}括号中声明的变量仅在该范围内有效,因此使用它的任何其他代码也必须出现在这些大括号内。


    编辑:

    顺便说一句,这个怪癖并不像你想象的那么少见。 在C和Java中,在forwhiledo循环中,甚至在ifelse子句中使用局部变量声明作为孤立语句(意思是“不用大括号包围”)也是非法的(事实上,这是我强烈推荐),我认为我们一般不会写这样的错误开始,因为在这样的上下文中声明一个变量是唯一的语句是没有意义的,对于开关 /结构的情况下 ,虽然,有些人省略大括号,因为break语句是控制流的关键语句。

    要查看编​​译器的适合性,请将这个可怕的无意义代码片段复制到您的(Objective-)C代码中:

    if (1)
        int i;
    else
        int i;
    for (int answer = 1; answer <= 42; answer ++)
        int i;
    while (1)
        int i;
    do
        int i;
    while (1);
    

    还有一个总是用{}括号来划定这些构造体的另一个原因。 :-)


    我之前遇到过这个问题,结论是你只是把代码放在一个块中。

    switch (i) {
    case 0:
        {
            int j = 1;
            break;
        }
    }
    

    我使用的另一个简单的解决方法是在声明前添加一个空表达式(分号)。 这样可以避免将变量作用域限制为一个代码块(或者有一些带有代码块的情况语句,有些则没有)。

    switch (i) {
        case 0:;
            int j = 1;
            break;
    }
    
    链接地址: http://www.djcxy.com/p/14779.html

    上一篇: Declaring variables inside a switch statement

    下一篇: Multiple cases in switch statement