C 語言支持 + - * / % 五種運算,加減乘除取模。web
全部 CPU 都內建加法器,能夠完成加法操做。減法操做能夠轉爲加法操做。大部分 CPU 都沒有內置乘法器,此時編譯器會把 * / 乘除運算轉爲加法運算,用軟件來模擬乘法。算法
邏輯運算的返回結果是 1 或 0,C 語言中沒有布爾類型,真假即用 1 和 0 代替。express
邏輯與 &&:兩側表達式都爲真時,表達式爲真,不然爲假。
邏輯或 ||:兩側表達式都爲假時,表達式才爲假,不然爲真。數組
注意:C 語言在處理邏輯與 && 和邏輯或 || 時,若是邏輯與的左表達式爲假或邏輯或的左表達式爲真,則不會再執行右表達式。安全
#include <stdio.h> int main() { int a = 6; int res; res = ((a == 6) || printf("right express run\n")); printf("end of main,res is:%d\n", res); }
輸出爲:svg
end of main,res is:1
跟數學中的比較運算一致。函數
int a = 0x0; if (!a) printf("hello"); // a 邏輯取反後變成1,這一行會打印
三目運算符。a ? b : c
中,a 表達式爲真時執行 b,不然執行 c。spa
按位左移 <<:至關於乘法,左移 n 位至關於乘以2的n次方。最低位一概補0。
按位右移 >>:至關於除法,右移 n 位至關於除以2的n次方。有符號數最高位補符號位(負數補1,正數補0),無符號數最高位補0。指針
例如對於 0x1(0000 0001),左移一位後,變爲 0x2(0000 0010)。乘以 32 至關於左移 5 位。code
#include <stdio.h> int main() { char a = 0x1; int i; for (i = 0; i < 8; i++) { a = a<<1; printf("0x%x\n", a); } a = 1; for (i = 0; i < 8; i++) { a = a>>1; printf("0x%x\n", a); } a = -1; for (i = 0; i < 8; i++) { a = a>>1; printf("0x%x\n", a); } unsigned char b = -1; for (i = 0; i < 8; i++) { b = b>>1; printf("0x%x\n", b); } }
a & 0xf0
能夠屏蔽低 4 位。a | 0xf0
能夠開啓高 4 位。a = a ^ b; b = a ^ b; a = a ^ b;
& 也叫清零器,| 也叫設置器。例如,將變量的第3位設置爲1或清除爲0:
#include <stdio.h> int main() { char a = 0x1; // 0000 0001 a = a | (1 << 3); // 0000 1001 printf("%x\n", a); a = a & (~(1 << 3)); // 0000 0001,爲了安全,這裏不要直接計算 printf("%x\n", a); }
0xf0 按位取反獲得 0x0f。
除了 = 賦值運算外,還能夠在 C 語言中使用符合賦值運算符 +=、-=、*=、/= 、%=、&=、|=。例如上面的例子能夠變成:
a |= (1 << 3); //a = a | (1 << 3); a &= (~(1 << 3)); //a = a & (~(1 << 3));
小括號除了能夠改變優先級外,還能夠用於函數訪問。
方括號能夠用在數組聲明定義和使用中,用於訪問指定內存。
函數體、struct、union 體。
->
:地址訪問。聲明瞭指向 struct 類型的指針後,經過 ->
訪問其中元素。
.
:變量訪問。聲明瞭 struct 類型的變量後,經過 .
訪問其中元素。
#include <stdio.h> #include <string.h> typedef struct People { char name[20]; int id; } peo; int main() { struct People p1; peo* p2; strcpy(p1.name, "hello"); p1.id = 666; printf("%s, %d\n", p1.name, p1.id); p2->id = 888; printf(" %d\n", p2->id); }
&
做爲單目運算符,後面跟變量時,表示取地址運算符。做爲雙目運算符時,表示按位與。
*
做爲單目運算符,後面跟變量時,表示指針運算符。做爲雙目運算符時,表示乘法。