當前位置: 華文星空 > 知識

為什麽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 ;

來解決,誰都不會產生異議。

型別推導是個神器,誰用誰知道。