嗯,雖然這個問題提出得比較早,但似乎很多答主並沒有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
;
來解決,誰都不會產生異議。
類別推導是個神器,誰用誰知道。