当前位置: 华文星空 > 知识

为什么C语言用int *a 来声明指针变量,而不是int &a声明?

2016-07-22知识

嗯,虽然这个问题提出得比较早,但似乎很多答主并没有get到题主在问什么。

题主的问题是运算符优先级的问题,或者是=符号运用方面的问题。

C语言里边,变量声明后边的 = 符号跟赋值语句的的 = 符号含义不同。后来C++也继承了这个特性。而这可能是给题主造成困惑的核心。

int * a = & b ;

实际上可以理解为

int * ( a = & b ); // 只是示意,当然这样写是不对的

也就是说, 先把&b赋值给a,然后令 *a 的类型为 int

所以这里 &b 是赋值给 a 而不是赋值给 *a。

不过这里就存在一个矛盾:赋值语句的 = 符号的优先级低于 * 号 的,为什么这里 计算等于号 计算星号?按照运算符优先级规则,此处的 &b 应当赋值给 *a 才对。

个人认为有如下可能:

1,设计上为了方便导致。为了给指针赋值初始值省掉一个括号,这里刻意的特殊处理了赋值符号的优先级。

2,变量声明时初始化使用的 = 符号不是赋值符号,它具有完全不同的语义,从而具备不同的运算符优先级判定。

总的来说,题主的疑问是有道理的,这个地方的处理确实比较反常,此处的语法设计在逻辑上是不够完美的。

当然,如果使用 C++11,题主的问题就不存在了,因为可以用

auto a =& b ;

来解决,谁都不会产生异议。

类型推导是个神器,谁用谁知道。