【问题标题】:Weird behaviour in XCode [duplicate]XCode中的奇怪行为[重复]
【发布时间】:2013-04-17 12:14:35
【问题描述】:

只是想让您对此有所了解,我记得读过 switch-case 语句中禁止属性声明(即不允许使用 case:ABC int i=0;

今天早上我遇到了一件很奇怪的事情,

以下编译

switch(var1) {
  case 1:
    NSLog(@"hello");
    float x = 0;
    view.setCenter(CGPointMake(x,100));
    break;
  ...

而以下编译

switch(var1) {
  case 1:
    float x = 0;
    view.setCenter(CGPointMake(x,100));
    break;
  ...

因此,如果您使用语句(而不是声明)启动 case 表达式,它似乎可以编译。但是,当您尝试立即从变量声明开始时,它不会。

这背后的原理是什么?

编辑: 决定让我的问题更清楚,NSLog 有什么不同以便现在可以编译?

【问题讨论】:

  • 你得到什么编译错误?
  • @Spectravideo328 你是对的,那里的答案比我的要好得多。
  • 谢谢大家,谜团解决了 :) 所以这不是编译器错误,但根据定义,标签后面必须跟一个表达式,这很奇怪(我仍然没有看到任何好的理由应该是这样)

标签: c syntax compiler-errors case-statement


【解决方案1】:

NSLog 在这里没有什么不同。是; 发挥了作用:

switch(var1) {
    case 1:
        ;
        float x = 0;
        view.setCenter(CGPointMake(x,100));
        break;

编译。甚至

 switch(var1) {
    case 1:;
        float x = 0;
        view.setCenter(CGPointMake(x,100));
        break;

不能编译的是紧跟在:之后的float(或其他类型)。换句话说,: 之后应该是命令,而不是声明。

【讨论】:

    【解决方案2】:

    如果你满足以下条件,它会编译:

    switch(var1) {
      case 1:
      {
        float x = 0;
        view.setCenter(CGPointMake(x,100));
      }
        break;
    

    至于为什么检查this answer

    【讨论】:

    • 我在那个 SO 帖子或它提到的“四个开关怪异”帖子中都找不到。我的问题是 NSLog 有什么不同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2015-07-26
    • 2020-04-26
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多