運算子優先順序及結合順序隨筆
最近在網上看到一段開源**中有乙個關於鍊錶操作的**,其中有一行如下:
--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.位操作運算子 參與運算的量,按二進位...