一、移位操作符
1.1左移操作
左邊丟棄,右邊補0
1.2右移操作
算數右移:右邊丟棄,左邊補原符號位
邏輯右移:右邊丟棄,左邊補0
int main()
{int a = -1;int b = a >> 1;printf("b=%d\n",b);return 0;
}
原碼:10000000 00000000 00000000 00000001
反碼:11111111 11111111 11111111 11111110
補碼:11111111 11111111 11111111 11111111
右移一位,左邊補符號位1,仍然為11111111 11111111 11111111 11111111
輸出:b=-1
說明輸出采用的是算數右移,a的值本身不發生變化。沒有移動負數位
二、編程題
2.1 不能創建臨時變量,實現兩個變量的交換
方法1:(缺陷:數值太大的時候容易溢出)
int a = 3;
int b = 5;
a = a + b;? ? //存放a與b的和
b = a - b;? ? //(a+b)-b=a
a = a - b;? ? // (a+b)-a
方法2:
int a = 3;
int b = 5;
a = a^b;
b = a^b;? ?//b = (a^b)^b=a
a? =a^b;? ?//a = (a^b)^a=b
補充:
0與任意數異或都為他本身? ? a^0=a;
任意數與他本身異或都為0? ? a^a=0;
三、單目運算符
!、-、+、&、sizeof、~、++、--、*、(類型)
3.1 sizeof(字節為單位)
sizeof返回的是一個無符號整數
%d打印的是有符號整數,%u打印的是無符號整數
int a = 10;
int arr[10] = {0};
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(int [10])); //40printf("%d\n", sizeof(a));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof a); //sizeof是操作符,不是函數
printf("%d\n", sizeof int); //err
3.2 sizeof(s = a+2)
short s = 5;
int a = 2;
printf("%d\n", sizeof(s = a+2));
printf("%d\n", s);
//sizeof括號中的表達式不參與運算
sizeof(s = a+2)在編譯時就已經完成,計算的就是s的大小;s = a+2在運行時計算,所以到運行時?沒有s = a+2
3.3 ~按位取反
int main()
{int a = 0;printf("%d",~a);return 0;
}
整型數據在計算機中是以補碼的形式存在的,按位取反是對補碼進行取反
0的原碼、反碼、補碼
0+:00000000 ?00000000 ?00000000
0-:10000000? ?11111111? ? 00000000
0+和0-的補碼都是00000000
a的大小為4個字節,共32位
// 0的補碼: ? ? 00000000 00000000 00000000 00000000
//~0的補碼: ? ?11111111 11111111 11111111 11111111
//~0的反碼: 11111111 11111111 11111111 11111110?
//~0的原碼: 10000000 00000000 00000000 00000001 = -1
四、邏輯操作符
int main()
{int i = 0, a = 0, b = 2, c = 3, d = 4;i = a++ && ++b && d++;printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);return 0;
}
輸出:? ? ? a = 1
?????????????????b = 2
?????????????????c = 3
? ? ? ? ? ? ? ? ?d = 4分析:?? ?i = a++ && ++b && d++;? 0&&()結果一定為0,所以后面的式子不在進行運算
a的值先為0與后面的式子&&,在+1,b,d的值不發生變化
五、逗號表達式
從左向右依次計算,但整個表達式的結果是最后一個表達式的結果
int a = 3;
int b = 5;
int c = 0;
int d = (c = 5, a = c + 3, b = a - 4, c += 5);
printf("%d\n", d); //10
a = get_val();
count_val(a);
while(a>0)
{//業務處理a = get_val();count_val(a);
}while( a = get_val(),count_val(a),a>0)
{//業務處理
}