最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

C語言條件運算符嵌套執(zhí)行順序

2023-03-22 17:44 作者:北岸已春山  | 我要投稿

下午刷題,遇到一道關(guān)于條件運算符的題目,做的過程中想到了老師上課時的解釋,兩個條件運算符互相嵌套,具體的執(zhí)行過程。

當(dāng)時我的想法很簡單,運算符優(yōu)先級相同,從左往右執(zhí)行不就好了?

老師的解釋與我不同,他說:運算符優(yōu)先級相同的情況下應(yīng)考慮結(jié)合性!

而條件運算符的結(jié)合性是從右到左。

按老師說的話,這串代碼應(yīng)該先執(zhí)行

這個言論對于我來說是新穎的,這是我第二位C語言老師,對于此觀點他與我第一位老師截然不同,仔細想想我的第一位老師關(guān)于這一點是以“常識”一筆帶過的,我也是以“常識”來寫代碼的。

結(jié)合性,好像還真沒細細理解過。

所以我趁熱打鐵,在書上,網(wǎng)絡(luò)上搜集了一些資料。

另說,雖然條件運算符可以嵌套使用,但是為了避免代碼可讀性降低,建議在復(fù)雜情況下使用if-else語句。(要考試那沒辦法)


條件運算符的執(zhí)行順序是從左到右。當(dāng)有嵌套的條件運算符時,外層的條件運算符優(yōu)先級更高,然后依次向內(nèi)層執(zhí)行。

到這里,我之前理解的一個錯誤出現(xiàn)了,我一直以為條件運算符嵌套,優(yōu)先級是相等的,實則不然。

例如,下面是一個嵌套的條件運算符:


這個表達式的執(zhí)行順序如下:

  1. 首先計算外層的條件a > b。

  2. 如果a > b為真,進入內(nèi)層條件a > c

    • 如果a > c為真,表達式的值為a。

    • 如果a > c為假,表達式的值為c

  3. 如果a > b為假,進入另一個內(nèi)層條件b > c

    • 如果b > c為真,表達式的值為b。

    • 如果b > c為假,表達式的值為c。

這個嵌套的條件運算符實際上用于找出三個數(shù)中的最大值。當(dāng)然,這個例子還算簡單,如果有更多層次的嵌套,代碼的可讀性將變得非常差,這時候應(yīng)該考慮使用if-else語句。

那么,在查閱資料了解后,很快我又有了第二個問題:條件運算符的結(jié)合性是從右到左,執(zhí)行順序是從左到右,結(jié)合性不會影響到執(zhí)行順序嗎?

事實證明,結(jié)合性和執(zhí)行順序是兩個不同的概念。結(jié)合性決定了多個運算符如何組合,而執(zhí)行順序決定了表達式中各部分的計算順序。

考慮這個嵌套的條件運算符:

因為條件運算符的結(jié)合性是從右到左,所以這個表達式實際上等價于:

執(zhí)行順序是從左到右,所以表達式的計算順序如下:

  1. 首先計算外層的條件a > b。

  2. 如果a > b為真,表達式的值為c

  3. 如果a > b為假,進入內(nèi)層條件d > e。

    • 如果d > e為真,表達式的值為f。

    • 如果d > e為假,表達式的值為g。

結(jié)合性和執(zhí)行順序之間的關(guān)系是,結(jié)合性確定了運算符的分組方式,而執(zhí)行順序決定了分組后的表達式如何計算。

在本例中,結(jié)合性使得內(nèi)層的條件運算符與外層的條件運算符正確地組合在一起,而執(zhí)行順序確保了在計算內(nèi)層條件之前先計算外層條件。

那么又來了,執(zhí)行順序,那是什么?

此前的我,僅局限于定義變量從右到左,其他的先看優(yōu)先級,再依次從左向右執(zhí)行,但事實證明我又錯了。

C語言的執(zhí)行順序并非簡單地分為從左到右和從右到左兩種。實際上,執(zhí)行順序主要受以下因素影響:

  1. 運算符的優(yōu)先級:優(yōu)先級較高的運算符先于優(yōu)先級較低的運算符執(zhí)行。例如,乘法和除法運算符的優(yōu)先級高于加法和減法運算符,因此它們會先執(zhí)行。

  2. 運算符的結(jié)合性:當(dāng)有相同優(yōu)先級的運算符連續(xù)出現(xiàn)時,結(jié)合性決定了它們的執(zhí)行順序。結(jié)合性可以是從左到右,也可以是從右到左。例如,加法和乘法運算符具有從左到右的結(jié)合性,而賦值和條件運算符具有從右到左的結(jié)合性。

  3. 表達式的括號:括號內(nèi)的表達式優(yōu)先級更高,會先于外部表達式執(zhí)行。括號可以改變運算符的優(yōu)先級和結(jié)合性。

  4. 順序點(Sequence point):順序點是程序中的一個點,在該點之前的所有操作都已完成,而在該點之后的所有操作都尚未開始。例如,分號;、逗號,&&、||運算符都是順序點。

而關(guān)于變量定義,它的執(zhí)行順序并不是從右到左。實際上,在變量定義時,首先執(zhí)行初始化表達式(如果有的話),然后將計算結(jié)果賦值給變量。初始化表達式的執(zhí)行順序遵循運算符優(yōu)先級、結(jié)合性和括號的規(guī)則。

在C語言中,執(zhí)行順序并非簡單地歸結(jié)為從左到右或從右到左,而是需要考慮多種因素。為了編寫可讀性和可維護性更好的代碼,建議使用括號明確表示運算符的優(yōu)先級和結(jié)合性(雖然考試的題不會這般人性化),以及遵循良好的編碼風(fēng)格和實踐。

好了,此次專欄到這里就結(jié)束了,希望看到這里的同學(xué)都有所收獲。

C語言條件運算符嵌套執(zhí)行順序的評論 (共 條)

分享到微博請遵守國家法律
崇仁县| 体育| 麦盖提县| 久治县| 乌拉特后旗| 克山县| 大姚县| 庄浪县| 明光市| 淳化县| 永登县| 德兴市| 竹山县| 昆明市| 香河县| 黄冈市| 新邵县| 长丰县| 牡丹江市| 巫山县| 湖南省| 天全县| 新津县| 柯坪县| 罗平县| 正镶白旗| 荥阳市| 新巴尔虎右旗| 长岛县| 渝北区| 宿州市| 兰西县| 丹凤县| 将乐县| 南阳市| 皋兰县| 辛集市| 赤峰市| 于都县| 津市市| 凉城县|