先回憶一下運算子的優先順序吧
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。由此可知, 對乙個變數實行前置或後置運算, 其運算結構是相同的, 但當它們與其他運算結合在乙個表示式中時, 其運算值就不同了。
講到這裡,大家應該都明白了吧。說白了,許多操作符的優先順序都是相同的。這時,操作符的結合性就開始發揮作用了。在表示式中如果有幾個優先順序相同的操作符,結合性就起仲裁的作用,由它決定哪個操作符先執行。先執行,可以看做是加上括號。比如,右結合(從右到左),那就是,把右邊的運算用括號先括起來,再與左邊的進行計算,這樣自然是先執行右邊的了。 比如 int a,b=1,c=2; a=b=c; 這裡』=』的結合性是從右到左。 故a=b=c; 可變為a=(b=c); 即a=2。
注意;在乙個運算量兩側的運算子,優先順序是相同時則按照運算子的結合性所規定的結合方向處理。
例如 賦值運算子+=和-=也處於同一優先順序,結合方向是自右向左,那麼
7+=3-=2;運算順序就是先算3-=2,結果為1,然後再算7+=1,結果為8;
再說一下結合性吧;不知道注意沒;第二級,13, 14別的都是自右向左的結合性;
再就可以聯絡到指標了。
先討論++與*的優先次序吧;
運算子結合性
在標準c語言的文件裡,對操作符的結合性並沒有做出非常清楚的解釋。乙個滿分的回答是 它是仲裁者,在幾個操作符具有相同的優先順序時決定先執行哪乙個。每個操作符擁有某一級別的優先順序,同時也擁有左結合性或右結合性。優先順序決定乙個不含括號的表示式中運算元之間的 緊密 程度。例如,在表示式a b c中,乘法...
運算子和結合性
第一級 結合方向自左向右,只用於陣列,作用 1.定義陣列,先定義後使用 2.通過陣列下標訪問陣列元素。int a 10 int arr 10 自定義資料型別 通過結構體的變數訪問內部成員 struct student struct student stu1 stu1.age 23 結構體的指標變數,...
C 運算子結合性與自增 減運算子
優先順序 運算子名稱或含義 使用形式 結合方向 說明 1 陣列下標 陣列名 常量表示式 左到右 圓括號 表示式 函式名 形參表 成員選擇 物件 物件.成員名 成員選擇 指標 物件指標 成員名 2 負號運算子 表示式 右到左單目運算子 按位取反運算子 表示式 自增運算子 變數名 變數名 自減運算子 變...