【发布时间】:2018-03-27 08:24:06
【问题描述】:
在 C(和其他一些类似 C 的语言)中,我们有 2 个用于处理指针的一元运算符:解引用运算符 (*) 和“地址”运算符 (&)。它们是左一元运算符,它在运算顺序上引入了不确定性,例如:
*ptr->field
或
*arr[id]
操作顺序是由标准严格定义的,但是从人类的角度来看,它是令人困惑的。如果 * 运算符是 right 一元运算符,则顺序很明显,不需要额外的括号:
ptr*->field vs ptr->field*
和
arr*[id] vs arr[id]*
那么,为什么运算符 left 是一元的,而不是右的,有充分的理由吗?想到的一件事是类型的声明。左运算符位于类型名称附近(char *a 与 char a*),但有些类型声明已经违反了此规则,所以何必麻烦(char a[num]、char (*a)(char) 等)。
显然,这种方法也存在一些问题,例如
val*=2
这将是 *= 的简写 val = val * 2 或取消引用并分配 val* = 2。
然而,这可以通过在取消引用的情况下要求 * 和 = 标记之间的空格来轻松解决。再一次,没有什么突破性的,因为有这样一条规则的先例(- -a vs --a)。
那么为什么他们是左而不是右运算符?
编辑:
我想指出,我问了这个问题,因为 C 的许多奇怪的方面都有有趣的解释,为什么它们是这样的,比如 existence of the -> operator 或类型声明或从 0 开始的索引。很快。原因可能不再有效,但在我看来它们仍然很有趣。
【问题讨论】:
-
你想重写 C 语法吗?
-
@RuRo:毫无疑问是有原因的 :) 但这可能只是最初创建该语言的人的偏好。
-
可能的罪魁祸首已经死了 6 年,R.I.P.
-
“为什么这种语言的设计者决定使用这种语法而不是其他同样可能的语法”类型的问题是无法回答的。
-
@n.m.如果你能逐字引用设计师的话,他们会非常负责任。
标签: c pointers syntax dereference operator-precedence