C ++中的分号?

是否真的需要“缺少分号”错误? 为什么不将其视为警告?

当我编译这段代码

int f = 1 int h=2; 

编译器聪明地告诉我,我错过了它。 但对我来说就是这样 – “如果你知道它,就把它看作是在那里并继续前进。(后来我可以修复警告。)

  int sdf = 1, df=2; sdf=1 df =2 

即使对于这段代码,它的行为也是一样的。 也就是说,即使多个语句(没有;)在同一行中,编译器也知道。

那么,为什么不删除这个要求呢? 为什么不表现得像Python , Visual Basic等。

讨论摘要

缺少两个示例/实例,分号实际上会导致问题。

1。

 return (a+b) 

这被认为是JavaScript最糟糕的方面之一。 但是,在这种情况下,分号插入是JavaScript的问题,但不适用于C ++。 在C ++中,如果是,您将收到另一个错误; 返回后插入完成。 也就是说,缺少返回值。

2

 int *y; int f = 1 *y = 2; 

对于这个我猜,没有比引入语句分隔符更好的方法,即分号

在许多情况下需要使用分号。

如果你有:

 int *y; int f = 1 *y = 2; 

这将被解析为

 int *y; int f = 1 * y = 2; 

所以没有分号就不明确了。

C ++编译器不这样做是非常好的。 JavaScript的最糟糕的一个方面是分号插入。 想象一下:

 return (a + b); 

C ++编译器将很乐意按预期继续下一行,而“插入”分号的语言(如JavaScript)会将其视为“返回”; 并错过了“(a + b);”。

而不是依赖编译器错误修复,使其成为使用分号的习惯。

首先,这只是一个小例子; 你确定编译器可以智能地告诉你更复杂的代码有什么问题吗? 对于任何一段代码? 所有编译器都能以同样的方式智能地识别它,这样一块C ++代码可以保证可移植而丢失分号吗?

其次,C ++是在十多年前创建的,当时计算资源并不像现在这样。 即使在今天,构建也可能需要相当长的时间。 分号有助于清楚地划分不同的命令(对于用户和编译器!),并帮助程序员和编译器理解正在发生的事情。

; 是为了程序员的方便。 如果代码行很长,那么我们可以按回车键进入第二行,因为我们有; 用于行分隔符。 这是编程惯例。 必须有一个行分隔符。

使用分号(或换行符,选择一个)使编译器变得更加简单并且错误消息更具可读性。

但与其他人所说的相反,两种forms的分隔符( 绝对的 )都是绝对必要的。

例如,考虑Haskell,它没有。 甚至当前版本的VB也允许在语句中的许多地方使用换行符,就像Python一样。 在许多地方都不需要延续线路。

例如,VB现在允许以下代码:

 Dim result = From element in collection Where element < threshold Select element 

没有语句分隔符,没有行继续,但没有任何含糊之处。

从理论上讲,这可以进一步推动。 通过引入一些规则,可以消除所有歧义(再次,看看Haskell)。 但同样,这使得解析器变得更加复杂(它必须在很多地方都是上下文敏感的,例如你的return示例,如果不先知道函数的返回类型就无法解析)。 再次,它使得输出有意义的诊断变得更加困难,因为错误的换行可能意味着任何一些事情,因此编译器无法知道用户所犯的错误,甚至不知道错误发生哪里

在C程序中,分号是语句终止符,而不是分隔符。 您可能想阅读这篇有趣的文章 。

给你们两个+1。

分号是一个命令行分隔符,不像VB,python等.C和C ++忽略代码行中的空格,包括回车! 这最初是因为在C计算机监视器开始时只能处理80个字符的文本,而C ++基于C规范,它也是如此。

我可以发布一个问题“当我尝试在多行上编写代码时,为什么我必须在VB中继续获取有关丢失\字符的错误,当然如果VB知道它可以插入它的问题吗?”

已经指出的自动插入可能是一场噩梦,特别是在包裹到第二行的代码上。

我不会扩展对分号和续行字符的大部分需求,两者都有优点和缺点,最后它是一个简单的语言设计选择(即使它影响所有用户)。

我更担心编译器修复代码的建议。

如果你曾经见过一个了不起的工具(比如……让我们选择一个merge工具)以及它自动化工作的方式,你会很高兴编译器没有修改代码。 最终,如果编译器知道如何修复代码,那么这意味着它知道你的意图,并且思想传输还没有实现。

至于警告 ? 任何值得盐的程序员都知道警告应该被视为错误(并且编译停止),那么什么是优势呢?

 int sdf = 1,df=2; sdf=1 df =2 

我认为一般的问题是没有分号就没有人知道程序员实际上有什么意思(例如,可能是第二行是sdf = 1 + df - 2;有严重的错别字)。 像这样的东西很可能是由完全任意的拼写错误引起的,并且有任何预期的意义,因此毕竟让编译器默默地“纠正”错误可能不是一个好主意。

您可能还注意到,您经常会得到“预期的分号”,其中真正的问题不是缺少分号,而是完全不同的东西。 想象一下格式错误的表达式,编译器可以通过静默输入和插入分号来理解。

分号可能看起来多余,但这是程序员确认“是的,这是我的意图”的简单方法。

此外,警告而不是编译器错误太弱。 人们在关闭警告的情况下编译代码,忽略他们得到的警告,而AFAIK标准从未规定编译器必须警告的内容。