C++中的分号?

Sys*_*min 23 c c++

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

当我编译这段代码

int f = 1
int h=2;
Run Code Online (Sandbox Code Playgroud)

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

  int sdf = 1, df=2;
  sdf=1 df =2
Run Code Online (Sandbox Code Playgroud)

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

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

讨论摘要

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

1.

return
 (a+b)
Run Code Online (Sandbox Code Playgroud)

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

2

int *y;
int f = 1
*y = 2;
Run Code Online (Sandbox Code Playgroud)

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

Del*_*ani 55

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

return
  (a + b);
Run Code Online (Sandbox Code Playgroud)

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

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

  • +1尽管你的意图尽可能明确,但总是很好的编程习惯 - 不要依靠你的工具为你做这件事. (10认同)
  • @SysAdmin:然后你需要在整个地方添加行继续字符,如果你忘了它们,你的代码仍然可以正确编译但不会按照你的预期进行. (5认同)
  • @SysAdmin:咖啡还是茶? (2认同)

Jas*_*ams 30

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

如果你有:

int *y;
int f = 1
*y = 2;
Run Code Online (Sandbox Code Playgroud)

这将被解析为

int *y;
int f = 1 * y = 2;
Run Code Online (Sandbox Code Playgroud)

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

  • 这不是模棱两可的,这是错的.你不能将`int`与指针相乘,终端也不能是左值. (5认同)
  • 认为程序员犯了一个错误,编译器注意到了.编译器可以猜测程序员错过了```?如果程序员错过了其他的东西(`*`可能适合上面)怎么办?编译器知道你犯了一个错误,但它不可能知道你的意图. (4认同)

Pet*_*tte 8

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

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