为了账号安全,请及时绑定邮箱和手机立即绑定

在switch语句中声明变量

在switch语句中声明变量

C
子衿沉夜 2019-09-21 14:15:35
我看到了这个问题的一些答案,但我明白了–您无法在内声明和分配变量switch。但是我想知道以下是否是正确的抛出错误错误:“ int”之前的预期表达式码:switch (i) {    case 0:        int j = 1;        break;}为什么在呼叫NSLog()之前没有打入电话?switch (i) {    case 0:        NSLog(@"wtf");        int j = 1;        break;}
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

如果您根据语言的语法进行操作,则实际上可以在开关中声明变量。由于出现错误,因为“ case 0:”是标签,在C语言中,在标签后的第一个语句中声明为非法是非法的-请注意,编译器需要表达式,例如方法调用,常规赋值等。(尽管可能很奇怪,但这是规则。)


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


编辑:


顺便说一下,这种怪异并不像您想象的那样普遍。在C和Java中,在for,while或do循环甚至if和else子句中使用局部变量声明作为lone语句(意思是“不用大括号括起来”)也是非法的(实际上,这是覆盖益智游戏#55 “的Java谜题”,我强烈建议)。我认为,我们一般不写这样的错误开始,因为这是毫无意义的变量声明为在这样的背景下的语句。随着开关 / 但是,案例构造有些人在休息后就省略了花括号 语句是控制流的关键语句。


要查看编译器是否符合要求,请将以下可怕的,毫无意义的代码段复制到您的(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);

始终使用{}大括号分隔此类构造体的另一个原因。:-)


查看完整回答
反对 回复 2019-09-21
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

我之前曾遇到过这个问题,结论是您只是将代码放在了一个块中。


switch (i) {

case 0:

    {

        int j = 1;

        break;

    }

}


查看完整回答
反对 回复 2019-09-21
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

我使用的另一个简单的解决方法是在声明之前添加一个空表达式(分号)。这避免了将变量范围限制为代码块(或某些case语句带有代码块,而有些case语句没有代码块)。


switch (i) {

    case 0:;

        int j = 1;

        break;

}


查看完整回答
反对 回复 2019-09-21
  • 3 回答
  • 0 关注
  • 671 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信