+ - * / %數組
注意:函數
規則:
按二進制形式把全部的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零。3d
例: 3 << 2
計算過程:
指針
數學意義:
在數字沒有溢出的前提下,對於正數和負數,左移一位都至關於乘以2的1次方,左移n位就至關於乘以2的n次方。code
規則:
按二進制形式把全部的數字向右移動對應位移位數,低位移出(捨棄),高位的空位補符號位,即正數補零,負數補1。blog
例1:11 >> 2
計算過程:
數學
例2:-7 >> 2
計算過程:
io
數學意義:
右移一位至關於除2,右移n位至關於除以2的n次方。table
注意:移位操做符不能移動負數位class
& :按位與(相同位置只有都爲1才爲1)
| :按位或(相同位置要有一個位爲1就爲1)
^ :按位異或(相同位置相同爲0,不一樣則爲1)
注意:他們的操做數都必須是整數,按位故而須要按照整數的二進制每位操做,
1.求一個整數二進制中1的個數?
//方法一 int CountOfNum1(int num) { int count = 0; while (num > 0) { if (num % 2 == 1) count++; num = num / 2; } return count; } //方法二 int CountOfNum2(int num) { int count = 0; int i = 0; for (i = 0; i < 32; ++i) { //把每一位右移到最右邊和1按位與,統計1出現的次數 if (((num >> i)&1) == 1) { count++; } } return count; } //方法三(最優) int CountOfNum3(int num) { int count = 0; while (num) { count++; num = num&(num - 1); } return count; }
2.不能建立臨時變量(第三個變量),實現兩個數的交換
int main() { int a = 10; int b = 20; //利用異或性質中間導了一遍 a = a^b; b = a^b; a = a^b; printf("a = %d b = %d\n", a, b); system("pause"); return 0; }
賦值操做符比較簡單,就是給變量賦值,比較常見的就是咱們在對一個已經被賦值的變量進行修改,直接將這個變量直接賦值成你想要的
例如:
int a = 0; a = 10;
+= -= /= *= %= >>= <<= &= |= 等等
操做符 | 名稱 |
---|---|
! | 邏輯反操做符 |
- | 負號 |
+ | 正號 |
& | 取地址 |
-- | 自減 |
++ | 自增 |
~ | 按位取反 |
* | 解引用、間接訪問 |
sizeof | 類型長度 |
(類型) | 強制類型轉換 |
注意:結合使用時必定要搞清楚優先級,若是不清楚,手動加上括號來控制
符號 | 名稱 |
---|---|
> | 大於 |
>= | 大於等於 |
< | 小於 |
<= | 小於等於 |
== | 等於等於 |
!= | 不等於 |
int main() { int a = 3; printf("%d", a += a-= a * a); return 0; } 輸出結果 -12 作題思路: 因爲每次都須要將後面的值算出來才能進行-=和+=,故此題是按照從右向左計算的,爲了方便理解,咱們能夠拆分計算 a += (a -= a*a) a -= (a*a) b = a*a=9 a -= (a*a)--> a -= b---> a = -6(注意此時a的值已是6了,後面運算時a的值都以6計算) a += (a -= a*a)---> a += a ---> -6+(-6)=-12
&& 邏輯與(「而且」):兩個操做數都爲真,結果才爲真
|| 邏輯或(「或者」):全部操做數都爲假時才爲假,有一個或者多個操做數爲真就爲真
注意:區分邏輯與/或 和 按位與/或的區別
#include <stdio.h> int main() { int i = 0,a=1,b=2,c =3,d=4; i = a++&&++b&&d++; //i = a++||++b||d++; printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d); return 0; } 輸出結果 2,3,3,5 // 2,2,3,4
A ? B : C --- 三元運算符
在某些場景下能夠替代if else語句
if(y > 0) x = 1; else x = 0;
以上代碼等同於下段代碼
( y > 0) ? x = 1 : x = 0;
將兩個及以上的式子鏈接起來,整個表達式的值是最後一個表達式的值
例:
int main() { int i = 1; int j = 1; int z = 0; z = i++,j++,++j; //z = (i++,j++,++j); printf("i=%d j=%d z=%d",i,j,z); return 0; } 輸出結果 2,3,1 // 2,3,3 解題思路: z = i++,j++,++j;由於=的優先級要高於逗號表達式,因此原式等於(z = i++),j++,++j; 由於後置加加先使用後加加,因此z=1,i=2,j++時j爲1,當走到j++後面的,時j已經變成2,++j後就成了3。 同理 z = (i++,j++,++j);()的優先級高於=,因此先算()裏的逗號表達式,再算=,因此z=3。
某些場景逗號表達式也可使表達簡潔
//while(a > 0) //{ // a = test(); // a++; //} //等價上面代碼 while(a = test(), a++, a > 0)
符號 | 功能 |
---|---|
[] | 數組訪問 |
() | 函數調用 |
. | 結構體/類 訪問成員 |
-> | 結構體/類 指針訪問成員 |