为什么没有分号会出错,但是有太多分号没有?

时间:2015-05-16 18:18:27

标签: c syntax

考虑这个C代码:

#include <stdio.h>;

int main(void) {
    puts("Hello, world!");; ;
    ;
    return 0; ;
    ; ;
};

在这里,我几乎可以随处可见分号。只是为了有趣。但令人惊讶it worked!我收到了关于分号后分号的警告,但其他绝对错误的分号也起作用了。如果我忘记在puts之后添加分号,我将收到以下错误

  

错误:预期&#39;;&#39;之前&#39;返回&#39;

为什么没有大量错误和无用的分号会导致错误?在我看来,它们应该被视为语法错误。

5 个答案:

答案 0 :(得分:10)

单个分号构造空语句。它不仅合法,在某些情况下也很有用,例如,while / for循环不需要真实的身体。一个例子:

while (*s++ = *t++)
    ;
  

C11 6.8.3表达式和空语句

     

null语句(仅由分号组成)不执行任何操作。

唯一的语法错误是这一行:

#include <stdio.h>;

答案 1 :(得分:5)

分号表示语句的结尾是否为空。没有分号意味着你没有关闭/结束最后一个语句但是启动了一个给出错误的新语句。分号过多表示每个空白语句结束。所以,它没有给出错误

答案 2 :(得分:1)

为什么空语句应该是错误?事实并非如此。

答案 3 :(得分:0)

int a;;;;;(语句分隔符)始终用于指定特定语句的结束。在下一个语句执行之后。

如果您没有放置分隔符,那么它将考虑使用当前语句的下一个语句并执行。这给出了一个合成错误。

但在其他情况下,当我们放置多个分界符时,例如:

int a

在这种情况下,我们有5个语句,其中int main() { int a=0 ;,; return 0; } 是第一个语句,接下来的四个语句是编译期间编译器将删除的空语句。

查看此问题的一些有趣案例

int main()
{
    int a=0 ,; /*change done*/
    return 0;
}

当我们更改上面的程序时,它仍然有效:

Private Sub Worksheet_Change(ByVal Target As Range)
   Dim intr As Range, t As String
   Set intr = Intersect(Range("D:D"), Target)
   If intr Is Nothing Then Exit Sub

   Application.EnableEvents = False
   For Each r In intr
      t = Replace(Replace(r.Text, "-", ""), " ", "")
      r.Value = "'" & Replace(Replace(t, ")", ""), "(", "")
   Next r
   Application.EnableEvents = True
End Sub

答案 4 :(得分:0)

;是C中的语句分隔符,如上面的答案中所述。 Rahul的答案是完全正确的,只是你可以看到this回答一个问题,该问题询问为什么C语句以分号结尾。因此,当你理解为什么使用分号时,你就会明白当你输出太多分号时会发生什么。