C語言運算子的結合性分析

2021-09-30 08:20:02 字數 1727 閱讀 6572

運算子的結合性指同一優先順序的運算子在表示式中操作的組織方向, 即: 當乙個運算物件兩側運算子的優先級別相同時, 運算物件與運算子的結合順序, c 語言規定了各種運算子的結合方向( 結合性) 。大多數運算子結合方向是「自左至右」, 即: 先左後右, 例如a- b+c, b 兩側有- 和+兩種運算子的優先順序相同, 按先左後右結合方向, b 先與減號結合, 執行a- b 的運算, 再執行加c 的運算。除了自左至右的結合性外, c 語言有三類運算子參與運算的結合方向是從右至左。即: 單目運算子, 條件運算子, 以及賦值運算子。關於結合性的概念在其他高階語言中是沒有的, 這是c語言的特點之一。

++a 或a++和--a 或a--分別稱為前置加或後置加運算和前置減或後置減運算,都是單目運算子。值得注意的是, 前置、後置運算只能用於變數, 不能用於常量和表示式, 且結合方向是從右至左。如當i=6 時, 求- i++的值和i 的值。由於「- 」(負號) 「++」為同乙個優先順序, 故應理解為- (i++), 又因是後置加, 所以先有-i++的值為-6, 然後i 增值1 為7, 即i=7。

例1 main()

要得出c 的值, 首先要搞清+++的含義。++運算子的結合方向是自右向左的, 如果將表示式理解為:c=a*b+(++b);實際上c 編譯器將表示式處理為:c=(a*b++)+b, 因為c 編譯器總是從左至右盡可能多地將若干個字元組成乙個運算子, 如i+++j 等價於(i++)+j。接下來是解決a*b++的問題, 因為++運算子的運算物件只能是整型變數而不能是表示式或常數, 所以a*b++顯然是a*(b++)而非(a*b)++, 因此整個表示式就是c=(a*(b++))+b,結果為c=20。

例2 main()

例3 main()

j 和m 的值均由表示式求得, 並且這兩個表示式均由自增運算子、加法運算子和賦值運算子組成。那麼, 它們的值到底為多少呢? j=1+1+1=3 還是j=1+2+3=6? m=2+3+4=9 還是m=4+4+4=12?上機執行結果為: i=4,j=3,m=10(vc6.0)。分析: 運算子「++」,「+」和「=」的優先順序是遞減的, 在計算時,先進行自增運算, 再進行加法運算, 最後是賦值運算。而自增運算又根據「i++」和「++i」的不同定義得到不同的值。i+++i+++i++先將i 原值(1)取出, 作為表示式中i的值進行加法運算得到3, 然後再實現三次自加; (++i)+(++i)+(++i)的計算與編譯器有關。

例4 設a=6, 求賦值表示式a+=a-=a-a*a 的值。

由於「*」(乘號)、「- 」(減號)優先順序高於「+=」、「- =」, 且「*」優先順序高於「- 」, 故先求a- a*a, 即6- 6*6=- 30, 由「+=」,「-=」為同一優先順序, 且是從右至左的結合方向, 再求a- =- 30, 即a=a- (- 30)=6+30=36, 最後求a+=36, 即a=a+36=36+36=72, 所以賦值表示式的值為a=72。

例7 設m=1,n=2,b=3, 求賦值表示式m+=n-=---b 的值。

這裡共有四個運算子「+=」、「-=」、「-」(負號)、「--」, 由運算子優先順序, 應先計算---b, 但「--」與「-」(負號)優先順序相同, 如按從右到左的結合方向, 它可能是-(--b), 也可能是--(-b), 究竟是哪乙個呢?前面已講過, 前置運算只能用於變數, 不能用於表示式, 而(-b)不是乙個變數, 而是表示式, 故只能是-(--b), 即為-(3-1)=-2; 然後計算n-=-2, 即n=n-(-2)=2-(-2)=4; 最後計算m+=4, 即m=m+4=1+4=5, 所以賦值表示式的值m=5。

當看到乙個複雜的c語言表示式時, 首先應按優先順序進行運算, 然後在同一優先順序中按結合方向進行運算。

運算子結合性

在標準c語言的文件裡,對操作符的結合性並沒有做出非常清楚的解釋。乙個滿分的回答是 它是仲裁者,在幾個操作符具有相同的優先順序時決定先執行哪乙個。每個操作符擁有某一級別的優先順序,同時也擁有左結合性或右結合性。優先順序決定乙個不含括號的表示式中運算元之間的 緊密 程度。例如,在表示式a b c中,乘法...

運算子和結合性

第一級 結合方向自左向右,只用於陣列,作用 1.定義陣列,先定義後使用 2.通過陣列下標訪問陣列元素。int a 10 int arr 10 自定義資料型別 通過結構體的變數訪問內部成員 struct student struct student stu1 stu1.age 23 結構體的指標變數,...

C 運算子結合性與自增 減運算子

優先順序 運算子名稱或含義 使用形式 結合方向 說明 1 陣列下標 陣列名 常量表示式 左到右 圓括號 表示式 函式名 形參表 成員選擇 物件 物件.成員名 成員選擇 指標 物件指標 成員名 2 負號運算子 表示式 右到左單目運算子 按位取反運算子 表示式 自增運算子 變數名 變數名 自減運算子 變...