C中括號優先順序的思考

2021-08-25 01:50:11 字數 817 閱讀 3822

問題源於論壇的一道題目:

下面是問題:

設int arr=; int *ptr=arr; *(ptr++)+=123; printf("%d,%d",*ptr,*(++ptr)); 答案為什麼是:8,8

問題的焦點也落在printf執行的問題上,到底先執行誰,後執行誰, 還有部分有才青年將該問題中庸化,覺得跟編譯器有關。

執行的順序真的跟編譯器有關嗎? 後面再討論這個問題。

printf執行的問題, 完全可以歸結函式執行順序的通用問題, 所以,用例子來將該問題抽象化:

#include int left() int right() int myfunction(int a, int b) int main()

執行的結果是:

right

left

從中可以看出來, 括號中(理解為函式即可), 執行的順序是先從右邊,再從左邊。

現在,再考慮編譯器的影響, 我們說的編譯器不是你自家開發的編譯器, 這個世界上總有些bt的機構, 可能也會開發乙個編譯器,可能也搞些非常bt的功能(類似於咱移動喜歡將別人好好的wifi給閹割了), 我們不討論bt的個案。

ansi c的標準中,一條不成文的規定是, 目標引數往往作為第乙個引數, 類似於strcpy(dst, src). 這個規定,主流的編譯器都認同這樣一條規則, 在操縱目標之前, 必定先要將源好好處理一把, 所以, 函式中,也就是括號中,確定的優先順序,是從最右邊,也就是從src源開始處理,處理完後,再進一步處理dst的。

這樣的設計,既符合ansi c的約定, 也符合處理常識。

如果真的有編譯器不按照這條路走的, 崩潰的不是程式,而是coder.

C 的優先順序

c語言優先順序 優先順序運算子 名稱或含義 使用形式 結合方向 說明陣列下標 陣列名 常量表示式 左到右圓括號 表示式 函式名 形參表 成員選擇 物件 物件.成員名 成員選擇 指標 物件指標 成員名 負號運算子 常量右到左 單目運算子 型別 強制型別轉換 資料型別 表示式 自增運算子 變數名 變數名...

sql指令碼中的優先順序(and or 和 括號)

二月初三辛丑年 牛辛卯月 壬戌日 好多天沒更博了,為啥呢,因為我的需求上線了,然後又被bibibi了,其中各種心酸背鍋以及瑟瑟發抖。天吶 回來繼續說,今天乙個sql的修改 需求是這樣的 在乙個日期範圍內 2020 03 01至2021 03 12 查詢人員型別為 1003 1004 1006 的資料...

C語言弄搞優先順序 優先順序問題

c語言易弄錯優先順序 1.的優先順序高於 操作符用於消除這類問題 p.f誤認 p所指物件的字段f。p f 實際結果 對p取f偏移,作為指標,然後作為解除引用操作。p.f 2.優先順序高於 int ap誤認 ap是個指向int陣列的指標。int ap 實際結果 ap是個元素為int的指標陣列。int ...