標籤:tar 其他 括弧 算術運算子 html 賦值運算 知識 get 進階
重新翻了遍C語言,覺得對c語言運算子結合性有必要提一下,畢竟去年我自己剛學c語言的時候,就沒搞明白結合性的問題。
什麼是左結合?什麼是右結合?它們是幹嘛用的?它們是什麼時候用的?
本文將圍繞這幾個問題展開..
(小白文,大神繞道)
先附錄幾個自己學習過程中的參考網站。(有些見解和例子來自一下網站)
http://wenku.baidu.com/link?url=W2ofiBx4yEtrxAAfV8lUaR-bYSIuBox1_DH-1mG6g6q0VeNBR31OfKlaUXRQ6ARQMJEo-r1HVvYBjXVVvtFaSI5CxI4MerOLVxzS3yZRtiS
http://c.chinaitlab.com/basic/873233.html
http://bbs.csdn.net/topics/370153775
在講結合性之前,先提一下c語言的運算子及其優先順序關係。
C語言運算子優先順序
優先順序 |
運算子 |
名稱或含義 |
使用形式 |
結合方向 |
說明 |
1 |
[] |
數組下標 |
數組名[常量運算式] |
左到右 |
-- |
() |
圓括弧 |
(運算式)/函數名(形參表) |
-- |
. |
成員選擇(對象) |
對象.成員名 |
-- |
-> |
成員選擇(指標) |
對象指標->成員名 |
-- |
|
2 |
- |
負號運算子 |
-運算式 |
右到左 |
單目運算子 |
~ |
按位取反運算子 |
~運算式 |
++ |
自增運算子 |
++變數名/變數名++ |
-- |
自減運算子 |
--變數名/變數名-- |
* |
取值運算子 |
*指標變數 |
& |
取地址運算子 |
&變數名 |
! |
邏輯非運算子 |
!運算式 |
(類型) |
強制類型轉換 |
(資料類型)運算式 |
-- |
sizeof |
長度運算子 |
sizeof(運算式) |
-- |
|
3 |
/ |
除 |
運算式/運算式 |
左到右 |
雙目運算子 |
* |
乘 |
運算式*運算式 |
% |
餘數(模數) |
整型運算式%整型運算式 |
4 |
+ |
加 |
運算式+運算式 |
左到右 |
雙目運算子 |
- |
減 |
運算式-運算式 |
5 |
<< |
左移 |
變數<<運算式 |
左到右 |
雙目運算子 |
>> |
右移 |
變數>>運算式 |
|
6 |
> |
大於 |
運算式>運算式 |
左到右 |
雙目運算子 |
>= |
大於等於 |
運算式>=運算式 |
< |
小於 |
運算式<運算式 |
<= |
小於等於 |
運算式<=運算式 |
7 |
== |
等於 |
運算式==運算式 |
左到右 |
雙目運算子 |
!= |
不等於 |
運算式!= 運算式 |
|
8 |
& |
按位與 |
運算式&運算式 |
左到右 |
雙目運算子 |
9 |
^ |
按位異或 |
運算式^運算式 |
左到右 |
雙目運算子 |
10 |
| |
按位或 |
運算式|運算式 |
左到右 |
雙目運算子 |
11 |
&& |
邏輯與 |
運算式&&運算式 |
左到右 |
雙目運算子 |
12 |
|| |
邏輯或 |
運算式||運算式 |
左到右 |
雙目運算子 |
|
13 |
?: |
條件運算子 |
運算式1? 運算式2: 運算式3 |
右到左 |
三目運算子 |
|
14 |
= |
賦值運算子 |
變數=運算式 |
右到左 |
-- |
/= |
除後賦值 |
變數/=運算式 |
-- |
*= |
乘後賦值 |
變數*=運算式 |
-- |
%= |
模數後賦值 |
變數%=運算式 |
-- |
+= |
加後賦值 |
變數+=運算式 |
-- |
-= |
減後賦值 |
變數-=運算式 |
-- |
<<= |
左移後賦值 |
變數<<=運算式 |
-- |
>>= |
右移後賦值 |
變數>>=運算式 |
-- |
&= |
按位與後賦值 |
變數&=運算式 |
-- |
^= |
按位異或後賦值 |
變數^=運算式 |
-- |
|= |
按位或後賦值 |
變數|=運算式 |
-- |
|
15 |
, |
逗號運算子 |
運算式,運算式,… |
左到右 |
-- |
說明:
運算子共分為15級,1級優先順序最高,15級優先順序最低。
同一優先順序的運算子,運算次序由結合方向所決定。(結合性:2 13 14 是從右至左 其他都是 從左至右)
簡單記就是:! > 算術運算子 > 關係運算子 > && > || > 賦值運算子
再詳細一點,附帶一個口訣。(網上找的)
括弧成員第一; //括弧運算子[]() 成員運算子. ->
全體單目第二; //所有的單目運算子比如++、 --、 +(正)、 -(負) 、指標運算*、&
乘除餘三,加減四; //這個"餘"是指取餘運算即%
移位五,關係六; //移位元運算符:<< >> ,關係:> < >= <= 等
等於(與)不等排第七; //即== 和!=
位與異或和位或; "三分天下"八九十; //這幾個都是位元運算: 位與(&)異或(^)位或(|)
邏輯或跟與; //邏輯運算子:|| 和 &&
十二和十一; //注意順序:優先順序(||) 底於 優先順序(&&)
條件高於賦值, //三目運算子優先順序排到13 位只比賦值運算子和","高
逗號運算級最低! //逗號運算子優先順序最低
如果想詳細瞭解運算子優先順序的關係,我想上面的表格和口訣足以了。
有了以上的基礎,我們迴歸本篇文章的主題---結合性。
觀察上述運算子表格我們不難發現,在優先順序相同的列表中,有的不止存在一種運算子,那當這兩種運算子碰到一起了,該怎麼計算呢?
又或者,兩個相同的運算子在一起,該怎麼進行運算呢?
要解決這些問題,就必須瞭解結合性了。
C 語言與其他進階語言相比, 一個顯著的特點就是其運算子特別豐富, 共有34 種運算子。C 語言將這34 種運算子規定了不同的優先順序別和結合性。優先順序是用來標識運算子在運算式中的運算順序的, 在求解運算式的值的時候, 總是先按運算子的優先次序由高到低進行操作, 可是, 當一個運算對象兩側的運算子優先順序別相同時, 則按運算子的結合性來確定運算式的運算順序。
運算子的結合性指同一優先順序的運算子在運算式中操作的組織方向, 即: 當一個運算對象兩側運算子的優先順序別相同時, 運算對象與運算子的結合順序, C 語言規定了各種運算子的結合方向( 結合性) 。
大多數運算子結合方向是“自左至右”, 即: 先左後右, 例如a- b+c, b 兩側有- 和+兩種運算子的優先順序相同, 按先左後右結合方向, b 先與減號結合, 執行a- b 的運算, 再執行加c 的運算。
除了自左至右的結合性外, C 語言有三類運算子參與運算的結合方向是從右至左。即: 單目運算子, 條件運算子, 以及賦值運算子。
關於結合性的概念在其他進階語言中是沒有的, 這是C語言的特點之一,特別是從右至左結合性容易出錯, 下面通過幾個具體的運算子來剖析C 語言運算子的結合性。
若a 是一個變數, 則++a 或a++和- - a 或a- - 分別稱為前置加或後置加運算和前置減或後置減運算, 且++a 或a++等價於a=a+1, - - a 或a- - 等價於a=a- 1, 即都是使該變數的值增加1 或減少1。由此可知, 對一個變數實行前置或後置運算, 其運算結構是相同的, 但當它們與其他運算結合在一個運算式中時, 其運算值就不同了。
前置運算是變數的值先加1 或減1, 然後將改變後的變數值參與其他運算, 如x=5; y=8; c=++x*y; 運算後, c 的值是48,x 的值是6,y 的值是8。
而後置運算是變數的值先參與有關運算, 然後將變數本身的值加1 減1, 即參加運算的是該變數變化前的值。如x=5; y=8; c=x++*y;運算後, c 的值是40,x 的值是6, y 的值是8。
值得注意的是, 前置、後置運算只能用於變數, 不能用於常量和運算式, 且結合方向是從右至左。如當i=6 時, 求- i++的值和i 的值。由於“- ”(負號) “++”為同一個優先順序, 故應理解為- (i++), 又因是後置加, 所以先有- i++的值為- 6, 然後i 增值1 為7, 即i=7。
講到這裡,大家應該都明白了吧。說白了,許多操作符的優先順序都是相同的。這時,操作符的結合性就開始發揮作用了。在運算式中如果有幾個優先順序相同的操作符,結合性就起仲裁的作用,由它決定哪個操作符先執行。先執行,可以看做是加上括弧。比如,右結合(從右至左),那就是,把右邊的運算用括弧先括起來,再與左邊的進行計算,這樣自然是先執行右邊的了。 比如 int a,b=1,c=2; a=b=c; 這裡‘=‘的結合性是從右至左。 故a=b=c; 可變為a=(b=c); 即a=2。
差不多就講這些了。
總的來說,掌握上述優先順序,結合性是有一定用處的,但也不是必須的。 畢竟,咱們有()這個大招不是,哪裡不確定,哪裡補()就是了。
學習的路上,與君共勉。
C語言 結合方向 和優先順序