C 語言的運算符

算術運算

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);
	}
}

&、|、^

  • 按位與 &:任意位與 0 按位與,獲得0。按位與能夠用來屏蔽某位。例如 a & 0xf0 能夠屏蔽低 4 位。
  • 按位或 |:任意位與 1 按位或,獲得1。按位或能夠用來開啓某位。例如 a | 0xf0 能夠開啓高 4 位。
  • 按位異或 ^:兩位不一樣則爲 1,不然爲 0。主要用做算法上,工程上用的少。例如不借助中間變量交換兩個變量的值:
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);
}

& 和 *

& 做爲單目運算符,後面跟變量時,表示取地址運算符。做爲雙目運算符時,表示按位與。

* 做爲單目運算符,後面跟變量時,表示指針運算符。做爲雙目運算符時,表示乘法。

相關文章
相關標籤/搜索