運算子優先順序及結合順序隨筆

2021-09-08 08:52:56 字數 1888 閱讀 2180

運算子優先順序及結合順序隨筆

最近在網上看到一段開源**中有乙個關於鍊錶操作的**,其中有一行如下:

--pnode->next;

看到這段**,我一時想不起這些運算子的結合順序是什麼樣子了,於是開始查詢資料並寫了下面的測試程式:

1

//test operator priority

2 typedef struct

3 sturcta;67

int a = ;

8int b = 4

;9 sturcta temp1[2

];10 sturcta *ptemp1 = &temp1[0

];11

int val1 = 0, val2 = 0, val3 = 0;12

13 temp1[0].next = &a[2

];14 temp1[1].next = &b;

1516 val1 = *--ptemp1->next; //

equals to *(--(ptemp1->next)); after operation val1 = 1, ptemp1 = &temp1[0]

17 nslog(@"

val1 value: %d

", val1);

1819 val2 = *--ptemp1++->next; //

equals to *(--(ptemp1->next)), then ptemp1++; after operation val2 = 0, ptemp1 = &temp1[1]

20 nslog(@"

val2 value: %d

", val2);

2122 val3 = *ptemp1->next;

23 nslog(@"

val3 value: %d

", val3);

這段**主要作用是驗證前++、--,後++、--,以及->,*的優先順序和結合順序。

程式中第2到5行,首先定義了乙個結構體,該結構體中有乙個指向int型的指標。第9行定義了乙個結構體陣列temp1[2],緊接著在第10行定義乙個指向結構體陣列第0個元素的指標ptemp1。13,14兩行分別對陣列temp1的兩個結構體的next成員變數賦初值。最後16到23行對以上提到的四種的運算子進行了幾種組合,並列印測試結果。

下面我們分別看一下幾種運算子組合的具體情況:

第16行**,改行包含了前--,->以及*運算子。結合順序是首先ptemp1->next,然後在對拿到的next進行前--的操作,最後再取出--運算以後的指標所指向的數值。根據分析我們可以得到val1 = 1的結果。

第19行**,在前面執行的基礎上(前面的執行已經修改了next指標的指向)進行了前--,後++,->以及*操作。結合順序是首先ptemp1進行後++的操作(注:後++操作的運算子優先順序最高,但不會影響本次執行),然後在和->next結合獲得next的值(指向int的指標),接著再對該指標進行前--操作,最後對再取出--運算以後的指標所指向的數值。根據分析我們可以得到val2 = 0的結果(需要考慮到執行完第16行,ptemp1->next已經指向a[1]的位址)。

第22行**,在前面執行的基礎上,對ptemp1的後++操作進行了驗證,可以明顯的看出此時ptemp1已經指向結構體陣列的第1個元素了。

上述**只是為了驗證運算子的優先順序問題,日常的**中還是盡量避免這樣寫,特別是不要想19行那樣,建議最好加上「()」,例如19行的**就可以修改為下面這樣:

val2 = *(--((ptemp1++)->next)); 

總之如果不清楚優先順序和結合順序,就多加一些「()」,這樣自己看起來清晰,也方面後面維護**的同事。

運算子優先順序及結合

下面的內容為本人無聊時自我猜想,不保正內容的正確性,如有問題,請見諒。0 空格可以告訴編譯器名顯邏輯 1 注意向後不能連續有三個以上 可以用空格告訴編譯器明顯的邏輯。如 不能有a b 可以有a b 2 注意向前不能有連續兩個以上 可以用空格告訴編譯器明顯的邏輯。如 不能有a b 可以有a b或a b...

python運算子及優先順序順序

python語言是一門指令碼語言,支援物件導向 面向過程程式設計,兼具編譯性和解釋性的動態語言,整理出學習過程中一些基本python運算子和運算子的優先順序順序。運算子描述 加 兩個物件相加 減 得到負數或是乙個數減去另乙個數 乘 兩個數相乘或是返回乙個被重複若干次的字串 除 x除以y 取模 返回除...

運算子 優先順序 結合性

語言的運算子可分為以下幾類 1.算術運算子 用於各類數值運算。包括加 減 乘 除 求餘 或稱模運算,自增 自減 共七種。2.關係運算子 用於比較運算。包括大於 小於 等於 大於等於 小於等於 和不等於 六種。3.邏輯運算子 用於邏輯運算。包括與 或 非 三種。4.位操作運算子 參與運算的量,按二進位...