【问题标题】:If ... else switch ... statementIf ... else switch ... 语句
【发布时间】:2017-07-05 13:30:46
【问题描述】:

以下代码在我的 gcc 5.4.0 上编译,不会产生任何警告并且工作正常:

if (a == 0) {
    puts("0");
} else switch (a) {
    case 1: puts("1"); break;
    case 2: puts("2"); break;
    default: puts("default"); break;
}

if ... else switch ... 语句正确吗?

【问题讨论】:

  • 正确,是的。格式很糟糕,是的。
  • C++ 中的类似问题:*.com/questions/35985592/…
  • 相关趣事:C 语言实际上没有else if 语句。这是一个没有大括号的else 语句,后跟另一个if 语句。 else if(a==b){ }else /* new line */ { if(a==b){} } 的无括号、奇怪的缩进版本。
  • @Lundin 没错。 IMO 许多书籍和教程建议else if 是一个声明,但实际上不是

标签: c gcc


【解决方案1】:

您的代码没有问题。 grammar for if ... else如下:

attr(可选) if (条件) statement-true else statement-false

switch是一个语句,所以可以跟在else之后。


请注意,else if 也不是特殊结构,它只是 if 之后的 if 语句。

【讨论】:

    【解决方案2】:

    你所拥有的在语法上是正确的......但它并不容易阅读。

    如果您的代码正在接受审查,您可能会被拉上去 - 因为您正在使用“无括号的多行语句作为条件的一部分”。

    宁愿明确写成这样:

    if (a == 0) {
        puts("0");
    } else {
        switch (a) {
            case 1: puts("1"); break;
            case 2: puts("2"); break;
            default: puts("default"); break;
        }
    }
    

    合法性与以下合法性相同:

    if (a == 0)
        puts("0");
    else
        puts("not0");
    

    当重新访问代码时,这样的构造可能会导致错误...我似乎记得最近的一个“流行”漏洞被实现(错误地...希望)部分是由于这个“无支撑“使用if

    【讨论】:

      【解决方案3】:

      switch 是一个语句,所以这只是在else 中添加一个语句。

      不一样

      else
        a = 0;
      

      else
      {
        switch(a)
        {
        case 1:
        ...
        }
      }
      

      这不是很常见的写法,但是很好。

      【讨论】:

        【解决方案4】:

        你的代码没有错,写这个也一样:

        if (a == 0) {
            puts("0");
        } else {
            switch (a) {
                case 1: puts("1"); break;
                case 2: puts("2"); break;
                default: puts("default"); break;
            }
        }
        

        这是完全合法的。 else switch 不是一个真实的声明。

        你的说法是

        if(condition){code block} else {code block}
        

        code block 可以包含任何语句,例如您的switch 语句。

        【讨论】:

          【解决方案5】:

          if 的语法是:

          if ( condition ) statement-true  else statement-false
          condition is an expression convertible to a boolean (true/false)
          statement-true is a statement which is executed if condition is true
          statement-false is a statement which is executed if condition is false
          

          switch 块是一个语句。

          所以是的,你的代码表现出正确的陈述。

          【讨论】: