C ++中的分号?

时间:2010-05-05 07:24:09

标签: c++ c

真的需要“缺少分号”错误吗?为什么不把它当作警告呢?

编译此代码时

int f = 1
int h=2;

编译器智能地告诉我,我错过了它。但对我而言,就像 - “如果你知道它,就把它视为存在并继续前进。(后来我可以修复警告。)

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

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

那么,为什么不删除这个要求呢?为什么不表现得像PythonVisual Basic

讨论摘要

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

1

return
 (a+b)

这是JavaScript最糟糕的方面之一。但是,在这种情况下,分号插入是JavaScript的问题,但不是 对于C ++。在C ++中,如果在返回后完成;插入,则会出现另一个错误。也就是说,缺少返回值。

2

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

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

9 个答案:

答案 0 :(得分:55)

非常很好,C ++编译器不会这样做。 JavaScript的最差方面之一是分号插入。想象一下:

return
  (a + b);

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

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

答案 1 :(得分:29)

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

如果你有以下内容:

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

这将被解析为

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

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

答案 2 :(得分:8)

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:3)

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

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

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

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

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

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

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

答案 5 :(得分:2)

在C程序中,分号是语句终止符,而不是分隔符。您可能需要阅读this fun article

答案 6 :(得分:0)

+1给你们两个。

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

我可以提出这样的问题:“当我尝试在多行上编写代码时,为什么我必须继续在VB中找到丢失\字符的错误,当然,如果VB知道它可以插入它的问题吗?”

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

答案 7 :(得分:0)

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

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

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

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

答案 8 :(得分:0)

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

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

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

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

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