C語言:運算子的優先級
第一級運算子

后置++:先將變數的值保存到臨時變數,然后計算++的值存回到變數
后置--:先將變數的值保存到臨時變數,然后計算--的值存回到變數
前置++:先計算++的值,然后存回到變數,最后從變數中取出值傳遞給函式
前置--:先計算--的值,然后存回到變數,最后從變數中取出值傳遞給函式
注:后置++/-- 優先于 -(負號運算子) 優先于 前置++
代碼區分:
void test2()
{
int i = 0;
int j = 0;
int k = 1;
/*
考點:
1. 引數是從右往左傳遞的
2. 前置++編譯器的處理方式為:先計算++的值,然后存回到變數,最后從變數中取出值傳遞給函式
3. 后置++編譯器的處理方式為:先將變數的值保存到臨時變數,然后計算++的值存回到變數
4. 優先級:后置++ > 符號 > 前置++
*/
printf("%d, %d, %d\n", ++i, ++i, ++i);
// 3,3,3
//首先資料根據先入后出的方式入堆疊,所以最后一個++i在堆疊頂,因為前置++是先計算++的值,
//這時變數中的i值為1,然后i的臨時變數繼續向下運算,直到堆疊底,再進行輸出,此時i的值為3,
printf("%d, %d, %d\n", j++, j++, j++);
//都是后置++,先使用后再++,所以輸出結果為2,1,0
printf("%d, %d, %d\n", k++, -++k, -k++);
//這里的“-”是負號運算子,陳述句從左到右運行,分別是3,-4,-1
}
第二級運算子

代碼舉例:
void test4()
{
int a[2] = { 10, 20 };
int *p1, *p2, *p3, *p4;
p1 = p2 = p3 = p4 = a;
printf("%d\n", *p1++); //10 后置++先使用變數再++,所以先輸出在計算,p1變數為2,
//但*p1++指向的是10
printf("%d\n", *p1); //20 變數p1為2,所以指向20
printf("%d\n", (*p2)++);//10 因為有括號先指向a[0]=10,對*p2在進行后置++
//也就是對a[0]=10進行后置++
printf("%d\n", *p2); //11
printf("%d\n", *++p3); //20 前置++優先級大于*,先地址++在進行解參考
printf("%d\n", *p3); //20
printf("%d\n",++*p4); //12 先解參考p4的值,然后a[0]=11值遞增,
//又是前置運算子所以先遞增再輸出,結果應該為12
printf("%d\n", *p4); //12
return;
}


補充:
左移運算子:
移位規則:左邊拋棄、右邊補0
右移運算分:
1. 邏輯移位:左邊用0填充,右邊丟棄(
2. 算術移位:左邊用原該值的符號位填充,右邊丟棄(負數用算數移位)


補充:


轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/226278.html
標籤:其他
