为什么在curl的支架后不需要分号?

我知道在声明之后需要一个分号(我说的是Java,C ++和类似的语言),但在curl的括号之后不需要。 为什么这样?

if (a > b) printf("hello!"); // semicolon is mandatory if (a > b) { printf("hello!"); } // semicolon is not required 

是什么原因? 我的意思是,这背后的理论是什么?

因为大括号用于分组语句,但它们本身不是语句。

因为语言定义为:

 statement: labeled-statement expression-statement compound-statement selection-statement iteration-statement jump-statement declaration-statement try-block labeled-statement: identifier : statement case constant-expression : statement default : statement expression-statement: expressionopt ; compound-statement: { statement-seqopt } statement-seq: statement statement-seq statement selection-statement: if ( condition ) statement if ( condition ) statement else statement switch ( condition ) statement condition: expression type-specifier-seq declarator = assignment-expression iteration-statement: while ( condition ) statement do statement while ( expression ) ; for ( for-init-statement conditionopt ; expressionopt ) statement for-init-statement: expression-statement simple-declaration jump-statement: break ; continue ; return expressionopt ; goto identifier ; declaration-statement: block-declaration 

所有正常控制语句都是相互递归构建的。 真正的工作是由expression-statement 。 如果你注意到expression-statement总是由; 。 要注意的其他陈述是jump-statement

但主要原因是在{}块之后不需要它们以允许easy解析语句。

除了哲学思路之外,编辑器必须知道将每个命令与下一个命令分开的位置。 支架本身就是一个分隔符,因此不需要分号。

大多数人认为语句是一个简单的命令,通常带有关键字,以及一些参数,例如“goto x”,“a = y + 2”等。必须有一些指示,其中一个语句结束,另一个语句结束开始,很像英语句子需要以句号结束。 传统上,大多数语言的语法在此类陈述之后需要使用分号。

{…}“大括号对”是一个 ,它是一种特殊的语句,但不需要分号,因为花括号使边界清晰。

许多语言允许“;” 单独表示空语句。 你为什么需要一个? 出于同样的原因,自然数系统需要“零”而不是“一”,并且集合可以是空的。

但这意味着你可以写:

 { ... } ; 

并且大多数语言编译器都会接受它而没有说话。 但你应该把它想象成:

 { ... } ; 

并且通常没有充分的理由来写这个。

实际上,接受{}的语言(例如,“空括号”)不需要空语句; ,因为它们在语义上是相同的。 但语言设计师似乎坚持传统; 你有没有注意到每一种“现代”语言似乎都是一个不好的C语法副本?

这是一个公平的问题。 块声明。 希望统一性是很自然的,并且想知道为什么所有陈述都不会被终止。 如果我们确实需要,则没有技术问题; 一个街区之后。 但我们也很懒,因为}可以明确地标记语句的结尾,我们不希望必须键入另一个标记。

一个相关的观察:在C ++中,你必须用a结束类声明;

 class A { ... }; // the semicolon is mandatory! 

这让很多人惹恼了。 分号是必需的,因为语言允许一些其他的东西}所以}不是一个可靠的结束标记。

在Java中,情况并非如此。 }结束了类声明,就是这样。 所以; 不需要。

加分号与效果相同

 if (a > b) { printf("hello!"); }printf("Goodbye"); 

并将printf("Goodbye")

如果您在C#3+中使用对象初始化语法,则括号后面会出现分号

 var foo = new Foo { Bar = "Fizzbuzz" }; 

在这种情况下,大括号定义了一个语句块。 像任何其他块一样。 当您即将声明并初始化arrays时,您必须提供; 因为在这种情况下你正在写一个声明。

注意:这个答案特定于C ++语言,而不是Java。

我会说语言语法不需要分号(2003)。 这就是语言定义语法的方式。

您编写的代码称为复合语句或块 ,语言规范(2003)在第6.3.3节中定义复合语句的语法,

因此,可以在需要一个语句的地方使用多个语句,提供复合语句(也称为“块”)。

复合语句:  
              {statement-seq opt }

语句序列:  
            声明
             statement-seq语句 

你在上面的语法中看到任何分号吗? 不。这就是为什么在代码中的花括号之后不需要分号。

在关闭大括号之后,你需要一个分号的唯一地方是在数组初始化之后,因为你可以继续行,例如

 int[] i= { 1,2,3}, j= {1}; 

分号是必需的,因为这里的’}’不告诉编译器行尾的位置。

同样

 Runnable r = new Runnable() { public void run() { } }, r2 = new Runnable() { public void run() { } }; // required as you could define another Runnable or an array of Runnable. 

因为curly不是语句,所以它用于对语句进行分组。 它不需要终止符。

当您使用花括号括起代码块时,您不需要分号:

 namespace Some { void fun(int i) { while(i != 0) { cout<<"i = "< 

在其他情况下,您需要分号(如初始化,声明等):

 struct A { // ... declare members }; // declaration; put semicolon int a[] = {0, 1, 2}; // initialization; put semicolon