C 语言发明的时间很早,当时人们对"类型系统" 还很陌生,很多人还习惯将二进制字节作为唯一的数据类型。设计 C 语言的语法时,也不知是谁想出来的,有种设计哲学:让声明的形式与它的使用形式尽可能相似。在这种设计哲学下,是先想如何使用,再来逆推如何声明,这样 C 语言的声明语法显得有点古怪,
比如:
C 这种语法设计,在今天看来是不好。使用这种语法,程序员不可以直接从左往右读,有时甚至需要从中间往两边读。只是 C 语言的影响太大,人们常见类 C 的语法,C 语言有些不好的地方也就忍了。C++ 就继承了这种语法,甚至这种语法的设计哲学,反正我总记不住成员函数指针是怎么声明的。
到今天,人们对“类型系统" 很熟悉了,也积累了几十年的语言使用经验。现在设计的语言,语法上倾向将类型放到后面,而并非放到前面。这样比较统一,也可以从左往右读。比如
var a : Int; var b : [Int]; var ptr : (Int, Int) -> Int; var signal : (Int, Int -> Void) -> (Int -> Void);
对比 C 语法
int a; int b[10]; int (*ptr)(int, int); void (*signal(int, void(*)(int)))(int);
特别最后一个类型,没有什么人可以一眼可以看出它的含义(我怀疑已经写错了)。这种情况,在 C 中会用 typedef 来简化。
typedef void (*handler_t)(int); handler_t signal(int, handler_t);
想了解更多,请阅读 C 专家编程 第 3 章。
-----------------
简单讨论前置类型(类型放在变量前面)和后置类型(类型放在变量后面)。跟原题目无关,是对评论的回复。这只是个人看法。
语言有类型推导,很多时候不用显式写类型。类型放在前面或者后面,对基本的数据类型影响还不算大。只是对复合类型,特别是函数(或者类似概念),语法上还是有影响的。怎么从语法上表示一个函数呢?使用前置类型,从语法上,大致可以写成:
Func<int(int, int)> fun;
你也可以去掉括号,写成,
Func<int, int, int> fun;
规定前面是参数类型,最后的是返回类型。但这种方式,从形式上是看不出那些是返回值,那些是参数。
你很难去掉这个 Func 的记号,去掉会引起歧义。更进一步,怎么去表示一个函数,它传入一个函数作为参数,而返回一个函数呢?大致为:
Func<Func<int, Void>, Func<int, Void>> fun;
这种语法,就会引起 Func 的嵌套,而 Func 纯粹多余。
更进一步,我增强了语言,可以支持多返回值。按照 C 的语法方式,大致定义成:
(int, int) fun(int a, int b);
那怎么表示这种函数类型呢。你可以写成:
Func<(int, int), (int, int)> fun;
那再继续,怎么表示这种,定义一个函数,传入一个多返回值的函数作为参数,而再次返回一个多返回值的函数作为参数。这样,不单单是 Func 会引起嵌套,连那些括号也会引起嵌套,而这些是语法噪音。为避免嵌套,语言中就会倾向于先定义某个类型,比如
typedef Func<int, Void> FuncT; Func<FuncT, FuncT> fun;
类型写在后面,可以轻易地去掉 Func 噪音。比如
var fun: (int -> void) -> (int -> void)
并且它的形式并非是嵌套的,而是一个线状,并且可以统一地连锁下去。
另外还有更具价值观的解释,编程时更应该关注变量用途,而不是变量的类型。变量的名字反应了用途,既然用途比类型更重要,名字就应该放在最开始。当然这种解释见仁见智,有点站不住脚。
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有