@
LotusChuan 习惯是习惯,但是习惯得只剩下习惯,逻辑上有时候就有点欠扁了。
(先明确大括号说的是复合语句的边界;其它情况,像 int a[] = {42};之类的情形,就算鼓吹换行的正常应该不会强迫症到强行换行。)
大括号换行的习惯大概是因为一些 IDE 的默认格式,根本是{和}的水平位置竖直方向上对齐,容易辨认。如果不换行,找起来就困难一些。
不对齐的主要理由是省空间,单独一行大括号毕竟太占地方。这个说法像++--和中缀声明符等经典 C 反人类设计一样看似有理,但仔细一想就明显双标:真想省空间,应该顺便}}}}了。
说这是 K&R 的理由应该比较充分。
注意 K&R 的风格{}换行也并不一致:函数体第一个{是换行的。因为 K&R C 函数定义中,参数的类型声明是在)和{之间,经常还需要一长串单独列出,和函数体的外层{}有必要区分,这还算能理解。
然而就是 K&R C 的函数语法,显然也不如全换行一致容易理解。奈何原作者就这样,相当多的用户入门起来也懒得多想,就有样学样咯。
更过分的是 C++和 Java 之类根本没这种语法的语言还照搬,就明显犯二了。
所以说是经典,还不如说就是教条。
K&R 的这种过气货还隔空殃及其它设计。C 函数的函数体必须是{}为边界的复合语句,这个在语义设计上是很没道理的——撑死语句就够了,不用{}这种废话。也就是因为 K&R C 的函数定义才有必要如此:如果没{,)和后面的语句之间的边界很不好分析。
结果这种设计被照抄到 C++的函数、Java/C#的方法等等一大票语言的语法中。C++“兼容”C 函数定义也就罢了,然而 C++11 的 lambda 都省不掉{}( Java 和 C#的倒是没有),这就是另一个境界的二了。
( emm ,C2x 终于要移除 K&R C 函数定义语法了,可喜可贺?)