c語言之優先級 結合性與自增運算,C語言之優先級、結合性與自增運算

優先級、結合性這些概念在初學的時候并沒有放在心上,今天又碰到這個問題,查了不少資料,再次做個總結。

在標準C語言的文檔里,對操作符的結合性并沒有做出非常清楚的解釋。一個滿分的回答是:它是仲裁者,在幾個操作符具有相同的優先級時決定先執行哪一個。

每個操作符擁有某一級別的優先級,同時也擁有左結合性或右結合性。優先級決定一個不含括號的表達式中操作數之間的“緊密”程度。例如,在表達式a*b+c中,乘法運算的優先級高于加法運算符的優先級,所以先執行乘法a*b,而不是加法b+c。

但是,許多操作符的優先級都是相同的。這時,操作符的結合性就開始發揮作用了。在表達式中如果有幾個優先級相同的操作符,結合性就起仲裁的作用,由它決定哪個操作符先執行。像下面這個表達式:

int a,b=1,c=2;

a=b=c;

我們發現,這個表達式只有賦值符,這樣優先級就無法幫助我們決定哪個操作先執行,是先執行b=c呢?還是先執行a=b。如果按前者,a=結果為2,如果按后者,a的結果為1。

所有的賦值符(包括復合賦值)都具有右結合性,就是在表達式中最右邊的操作最先執行,然后從右到左依次執行。這樣,c先賦值給b,然后b在賦值給a,最終a的值是2。類似地,具有左結合性的操作符(如位操作符“&”和“|”)則是從左至右依次執行。

結合性只用于表達式中出現兩個以上相同優先級的操作符的情況,用于消除歧義。事實上你會注意到所有優先級相同的操作符,它們的結合性也相同。這是必須如此的,否則結合性依然無法消除歧義,如果在計算表達式的值時需要考慮結合性,那么最好把這個表達式一分為二或者使用括號。

例:

a=b+c+d

=是右結合的,所以先計算(b+c+d),然后再賦值給a

+是左結合的,所以先計算(b+c),然后再計算(b+c)+d

C語言中具有右結合性的運算符包括所有單目運算符以及賦值運算符(=)和條件運算符。其它都是左結合性。

在C語言中有少數運算符在C語言標準中是有規定表達式求值的順序的:

1:&& 和 || 規定從左到右求值,并且在能確定整個表達式的值的時候就會停止,也就是常說的短路。

2:條件表達式的求值順序是這樣規定的:

test ? exp1:exp2;

條件測試部分test非零,表達式exp1被求值,否則表達式exp2被求值,并且保證exp1和exp2兩者之中只有一個被求值。

3:逗號運算符的求值順序是從左到右順序求值,并且整個表達式的值等于最后一個表達式的值,注意逗號','還可以作為函數參數的分隔符,變量定義的分隔符等,這時候表達式的求值順序是沒有規定的!

判斷表達式計算順序時,先按優先級高的先計算,優先級低的后計算,當優先級相同時再按結合性,或從左至右順序計算,或從右至左順序計算。

說完了優先級和結合性,下面說說自增運算符++

首先明白自增運算符的兩種使用情況:

(1)、單獨使用:i++;或者++1;這種情況下兩者是沒有區別的,i的值都會增加1;

(2)、在表達式中使用:a = i++;此時先取i的值賦給a,然后i的值自增,相當于a = i;i=i+1

a = ++i;此時先讓i自增,然后將自增后的值賦給a,相當于i = i + 1;a = i

明白了自增的這兩種情況,然后再來看看自增和結合性的混合情況:*p++ (*p)++ *(p++)三者的區別

對于*p++,首先*和++的優先級相同,然后看他們的結合性;由于優先級相同,那么他們的結合性必然也相同,都是右結合(從右至左)。

那么*p++ 就相當于*(p++),即根據右結合,p與++先結合形成(p++),然后再與*結合。

需要注意的一點(本文想著重說明的一點):雖然*(p++)中,p++被放在了括號內,此時應根據自增運算符++的兩種情況來考慮(而不需要考慮結合性了,此時與結合性已經無關),顯然這是上述的第二種情況,即在表達式中使用自增。所以是先取p的值與*結合,然后p值再自增,相當于*p,p++;千萬不要被括號迷惑,認為括號中的東西先運算。

明白了上面一點,則對于*(++p)就很好理解,p先自增,然后與*結合。

對于下面的例子也不難理解:

例一:char q[5] = "am";char *p = q;

那么,

(*p)++后,p就變成了"bm";因為是進行對其首元素進行加1運算

*(p++)后,p就變成了"m",因為完成取值運算后,p++指向下一個元素,即m,

*p++與*(p++)一樣。

如果只是征對這3個語句賦值給其他變量的話,3個的結果都是a,在這里。

char o = (*p)++;

char m = *(p++);

char n = *p++;

都是a。

例二:

int i = 0,a,b;

a = (i++)+(i++)+(i++);

b = (++i)+(++i)+(++i);

cout<

輸出結果(gcc編譯器):0 16 6

解釋:這里特別注明是gcc編譯器,在其他編譯器下的值可能不同。

對于int a=(i++)+(i++)+(i++);先取出i值進行加運算,然后再執行i的三次自增;?在其他編譯器下(如tc3.0),可能是0+1+2=3;

對于int b=(++i)+(++i)+(++i);每次i先自增,然后參與運算,所以是4+5+6=16.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530093.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530093.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530093.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android設置輸入框輸入字符限制,Android EditText限制輸入字符的方法總結

Android EditText限制輸入字符的方法總結最近項目要求限制密碼輸入的字符類型&#xff0c; 例如不能輸入中文。 現在總結一下EditText的各種實現方式&#xff0c; 以比較各種方法的優劣。第一種方式&#xff1a; 設置EditText的inputType屬性&#xff0c;可以通過xml或者Ja…

android動態改變菜單欄,Android動態設置主題(使用RxBus模式)

之前寫過一篇文章&#xff1a;RxBus的實現及簡單使用。今天我們嘗試使用RxBus動態切換主題。一、定義主題顏色color.xml#F44336#D32F2F#F44336#E91E63#C2185B#E91E63#795548#5D4037#795548#2196F3#1976D2#2196F3#607D8B#455A64#607D8B#FFEB3B#FBC02D#FFEB3B#673AB7#512DA8#673A…

android 圖片分析,Android圖片處理實例分析

本文實例講述了Android圖片處理的方法。分享給大家供大家參考&#xff0c;具體如下&#xff1a;package cn.szbw.util;import Android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.…

android開發按鈕顏色,Android編程實現簡單設置按鈕顏色的方法

本文實例講述了Android編程實現簡單設置按鈕顏色的方法。分享給大家供大家參考&#xff0c;具體如下&#xff1a;1.工程目錄a.在res目錄-新建drawble文件夾放入自定義圖片2.main.xmlandroid:orientation"vertical"android:layout_width"fill_parent"androi…

艾默生變頻器ev1000故障代碼_國產變頻器型號大全,梳理國產變頻的前世今生!...

在工控領域&#xff0c;變頻器已經廣為所知且應用范圍廣泛&#xff0c;各方對變頻器能給出形形色色的描述。維基百科給出的定義&#xff1a;“變頻器(variable frequency drive&#xff0c;常見縮寫VFD)&#xff0c;也稱為變頻驅動器或驅動控制器。變頻器是可調速驅動系統的一種…

android音樂播放器案例,Android MediaPlayer實現音樂播放器實例代碼

Android MediaPlayer實現音樂播放器1、布局文件android:layout_width"fill_parent"android:layout_height"fill_parent"android:orientation"vertical" >android:id"id/hint"android:layout_width"wrap_content"android:…

單邊指數信號的特點_今日股市分析:上證指數若能守住3400,蓄力反彈就有戲...

昨日整體概況上漲&#xff1a;848只 下跌&#xff1a;3009只漲停&#xff1a;69只 跌停&#xff1a;12只昨天的上證指數低開低走&#xff0c;午后沖紅又回落&#xff0c;另一邊的創業板卻是單邊下行跌超3%&#xff0c;板塊方向農業、洪水概念股、還有電力板塊較強。按照昨日置頂…

萬豐科技機器人排名_機器人系統集成“7宗最”

摘要&#xff1a;對于眾多集成商而言&#xff0c;作為典型的“夾心餅奧利奧”&#xff0c;面對客戶的各種要求&#xff0c;“不敢勉強你&#xff0c;只好為難自己”系真實寫照。1、企業數量最多GGII統計數據顯示&#xff0c;截至2019年年底&#xff0c;中國工業機器人產業企業數…

android 電池高溫關機,Android 關機問題分析指南

本篇文章主要介紹 Android 開發中的 關機 部分知識點&#xff0c;通過閱讀本篇文章&#xff0c;您將收獲以下內容:1 . 確認是亮屏關機還是滅屏關機&#xff1f;關機時是否有播放關機動畫&#xff1f;2 . 是直接關機還是關機后會自動重啟&#xff1f;3.異常關機時&#xff0c;連…

android switch 未定義,在switch語句中初始化時未定義的變量?

問題本身就是一個明顯的答案.無論如何,這是我的代碼片段......switch(cSet)...case 8:{ //Special CharactersfinalSet special;char* charSet new char[special.size() 1];charSet[special.size()] 0; //Append null terminatormemcpy(charSet, special.c_str(), special.…

android 克隆對象,克隆會破壞單例對象嗎?

假設有這樣一個場景&#xff0c;如果復制的目標對象恰好是單例對象&#xff0c;那會不會破壞單例對象呢&#xff1f;當然&#xff0c;我們在已知的情況下肯定不會這么干&#xff0c;但如果發生了意外怎么辦&#xff1f;不防來修改一下代碼。public class ConcretePrototype imp…

轉網口顯示未識別的網絡_已有1700萬用戶攜號轉網 超99%用戶1小時內辦結

攜號轉網是利國利民的大舉措&#xff0c;受到了很多電信用戶的擁護和支持。12月15日&#xff0c;工信部副部長劉烈宏在某會議上進行報告指出&#xff0c;目前我國 “攜號轉網”服務已經累計有 1700 萬用戶完成攜轉&#xff0c;一小時攜轉成功辦結率超過 99%。已有1700萬用戶攜號…

adb 更新 android sdk,[轉載]安裝Android時SDK?AVD?MANAGER時更新報錯的解決辦法

最近安裝Android SDK時&#xff0c;發現更新時出現“A folder failed to be renamed ormoved.”等類似錯誤。經過測試和G后發現解決辦法目前有兩種情況&#xff1a;1、確實是因為打開了相關目錄或者其他程序占用率文件夾句柄。關閉相關資源管理器或者關閉相關程序即可&#xff…

2020.2idea怎么創建html項目_陳肆橫項目日記:百度百科怎么創建自己的名字

百度百科是一個介紹人物很好的平臺&#xff0c;很多的都想創造屬于自己的百度百科。而人物百科詞條&#xff0c;是百度百科專門為知名人物提供個人信息展示的平臺。創建一個屬于自己的百度百科詞條&#xff0c;就相當于擁有了一張名片&#xff0c;不僅有著影響力與知名度的傳播…

android c++ gizp 調用 so,使用ndk-build編譯 android調用的so庫

前沿編譯so的方法有兩種方法第一種就是編寫原生的makefile文件利用gcc進行編譯&#xff0c;這里我講解的是另外一種。采用NDK提供的ndk-build編譯。簡介使用ndk編譯的時候需要介紹它的腳本文件,Android.mk和Application.mk&#xff0c;但是Application.mk是可選的&#xff0c;用…

elctron項目_electron項目結構介紹

#項目結構my-project├─ .electron-vue(webpack配置文件)│ └─ build.js(生產環境構建代碼)│ └─ dev-client.js(熱加載相關)│ └─ dev-runner.js(開發環境啟動入口)│ └─ webpack.main.config.js(主進程配置文件)│ └─ webpack.renderer.config.js(渲染進程配…

無法啟動mysqll1006_CentOS7下MySQL服務啟動失敗原因及解決方法

在重啟阿里的CentOS7服務器后,重啟MySQL 出現錯誤Starting mysqld (via systemctl):Job for mysqld.service failed because the control process exited with error code.See "systemctl status mysqld.service" and "journalctl -xe" fordetails.[FAILED…

html5判斷多選框是否選擇的函數,復選框(checkbox)、多選框

1、需求分析可同時選中多個選項&#xff0c;實現全選、全不選、反選等功能。2、技術分析基礎的HTML、CSS、JavaScript。3、詳細分析3.1 HTML部分圖示是一個列表加底部一段文字說明&#xff0c;列表包含三個部分&#xff0c;整體是一個多選列表&#xff0c;上部是總的選項&#…

layer調用父頁面方法_Ruby for SketchUp之圖層【Layer】

我們學習了群組、組件及組件定義&#xff0c;今天來看看圖層【Layer】&#xff0c;在Sketchup2020版本中已經更名為“標記”&#xff0c;如圖那么圖層在我們建模過程中能帶來哪些便利呢&#xff1f;可以快速的隱藏同一圖層內所有東西&#xff0c;而不需要逐一選擇并右鍵點擊隱藏…

html盒子有哪些屬性,盒子模型有哪些屬性 在html5中哪些元素具有盒子模型

HTML盒模型基本屬性有哪些CSS盒子模型就是在CSS技術所使用的一種思維模型。CSS假定所有的HTML文檔元素都生成一個描述該元素在HTML文檔布局中所占空間的矩形元素框&#xff0c;可以形象地將其看作是一個盒子。通過定義一系列與盒子相關的屬性&#xff0c;可極大地豐富和促進各個…