-5

比实际编程问题更多的社会好奇心......

一千年前,当我参加我的第一个编程课程(Fortran 66)和仅仅 500 年前,当我开始我的第一个 C 和 C++ 课程时,跨语言有一些非常标准的标点符号练习。我在 Basic(颤抖)、PL/1、PL/AS、Rexx 甚至 Pascal 中看到了它们。好的,APL2 不在此讨论范围内。

每种语言都有自己独特的标点符号。Pascal 的句点,Fortran 的逗号分隔的 do 循环,几乎所有其他人的分号。

据我所知,每种语言也有关键字(if、for、do、while、until 等),它们由空格(或左边距)<space>if<space> 等隔开。

每种语言都有功能,无论它们被称为什么子程序。一些内置一些用户编码的。它们是由 <whitespace|left margin>function_name(parameters); 引起的。如 sqrt( x ) 或 rand( y );

最近,似乎有一套新的标点符号规则。尤其是在 C++ 中,初始化器被粘在变量声明的末尾 int x(0); 或 auto_ptr<p> p(new gizmo); 这总是让我误以为有人在声明一个函数原型或将函数用作整数(嗯?)。

然后“if”和“for”似乎已经长大了;if(true) for(;;) 等。关键字是从什么时候变成函数的。

最后,函数似乎已经摆脱了它们的束缚。sqrt (2) 选择 (...)

问:旧的方式是什么时候消失的,而这种新的方式是什么时候流行起来的?除了我之外,还有没有人觉得阅读很烦人,并且标点符号用来传达的信息已经消失了?我很清楚 K&R 将 { 放在“if”或“for”的末尾以在这里和那里保存一个字节。不能在这里用这个借口。随着 HDD 空间飙升超过 100 MiB,作为丧失可读性的借口的空间消失了。

征求您的意见。如果有充分的理由这样做,我会很乐意学习它,也许再过 50 年我就会习惯它。当然,编译器识别这些(恕我直言)错别字并继续前进是很好的,但仅仅因为您可以这样编码并不意味着您必须这样做,对吗?

谢谢!

4

2 回答 2

4

关于 C++ 中对象和函数声明之间偶尔的歧义,您当然是正确的,请搜索“最令人烦恼的解析”。但是,如果您总是感到困惑,那仅表示您不太擅长阅读 C++。你应该通过练习来提高。但无论如何,众所周知,C++ 主要不是为了易于阅读而设计的,尤其是在没有实践的情况下。它还有其他设计优先级。不是每个人都共享这些优先级,这就是为什么不是每个人都使用 C++。

至于用括号括起来的条件,欢迎你写

if (foo) { bar; }

而不是

if(foo) { bar; }

为了在if函数调用的语法和语法之间建立人为的区别。只要词法分析器可以找到标记之间的边界,C 对空格就完全放松了,所以剩下的就是风格,而不是语言。如果你想知道这种对空白的放松是什么时候开始的——我想在 ALGOL 系列语言的开发过程中的某个时间。我不知道 ALGOL58,但那将是一个检查它是否存在的地方。

我很确定您的一些“旧方式”语言使用括号来对表达式进行分组,以及将函数参数括起来,因此您声称将括号称为函数调用封装器的真正含义从未真正存在过。

我认为我从未将 C 或 C++ 程序误认为是函数调用,而且我认为您也应该学会不要if如果人们用解析为 的宏做奇怪的事情if,毫无疑问他们会让我感到困惑。但是,没有人声称 C 风格的宏不会引起混乱。

如果您的主要主张是所有语言都应该以大致相似的方式标点符号,那么请查看 Lisp 和 Ruby。希望你会吹一个垫圈然后克服它;-)

我很清楚 K&R 将 { 放在“if”或“for”的末尾以在这里和那里保存一个字节。不能在这里用这个借口

这可能是 Ritchie 把它放在那里的原因,但这不是我把它放在那里的原因。我把它放在那里主要是为了节省垂直空间。这在今天仍然是有限的:我的硬盘可能能够以它容量的一小部分存储我将编写的每一行代码,但我仍然使用我的显示器的整个高度来读取代码,给予或占用一点屏幕家具。我很确定,{-on-a-line-on-its-own 是由不喜欢通过一次在屏幕上显示多个功能而使事情复杂化的人发明的。额外的垂直空白巧妙地防止了这种情况,并且也比更紧凑的样式更严格地限制了适合屏幕的功能的复杂性。

Python 为每个块节省了另一行垂直空间,根本不关心开闭标点符号,尽管我不认为这就是GvR 这样做的原因。

总之,我认为我的答案是“不”,并不是每个人都准确地分享您对代码格式的好恶。还是我的。想必也是好事。

于 2012-06-11T12:36:56.117 回答
0

由于 C++、Java、C# 等现代语言都是高级语言,所有这些关键字都让它们更易于理解和“友好”。它们应该尽可能接近我们的共同语言。有时会更改“默认”坐标以使代码看起来更好、更清晰和可读。这一切都是为了让程序员的工作更轻松。

现在许多框架,如 Visual Studio (.NET) “更正”您的代码放置和删除空格、制表符等。

问题只是习惯了这一点。该规则会发生变化,并将不断变化并采用新的标准。所以世代的问题在这里很明显。

顺便说一句,for是一个函数:它是一个迭代器。_ 也一样,if它需要一个谓词和一个函数作为参数。

于 2012-06-11T12:40:44.967 回答