首頁 > 軟體

C語言各類操作符全面講解

2022-05-30 14:01:31

1 算術操作符

+ - * / %

+,-和*運算元我就不多說了,這裡我們重點來 / 和%

/運算元

作用:就是求商

注意點:

1 二邊的運算元都是整形,商的結果就為整數

2 二邊的運算元有一個是浮點型結果就為小數

%運算元

作用:求餘數

注意點:. % 操作符的兩個運算元必須為整數。返回的是整除之後的餘數。

2 移位元運算符

<< 左移操作符

>> 右移操作符

注意:移位元運算符移的是二進位制位,且運算元只能是整數

<< 左移操作符

規則:左邊拋棄、右邊補0

程式碼舉例:

#include<stdio.h>
int main()
{
	int a = -5;
//正數的原碼,反碼和二補數都相同
//這是負數的規則:
//10000000000000000000000000000101原碼
//11111111111111111111111111111010反碼(原碼的符號位不變,其他位按位元取反)
//11111111111111111111111111111011二補數(反碼+1就是二補數)
	int b = a << 1;
//11111111111111111111111111110110二補數
//11111111111111111111111111110101反碼
//10000000000000000000000000001010原碼
	printf("a = %dn", a);
	printf("b = %dn", b);
	return 0;
}

當a<<1時

當a<<2時

當a<<3時

總結:

1 運算元被移位元運算符操作後其值仍然不變

2 計算機儲存的都是二補數,而列印出來的是原碼所對應的值

3 b=a<<n時,b的值位a*2^n,也就是說當我們左移1位時相當與乘了個2倍

>> 右移操作符

移位規則: 首先右移運算分兩種:

1. 邏輯移位 左邊用0填充,右邊丟棄

2. 算術移位 左邊用原該值的符號位填充,右邊丟棄

程式碼舉例:

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int a = -64;
	int b = a >> 1;
	printf("a = %dn", a);
	printf("b = %dn", b);
	return 0;
}

當a>>1時

當a>>2時

當a>>3時

總結:

1 右移操作和左移操作是本質都是對二補數的二進位制位進行操作

2 b=a>>n時,b的值位a/2^n,也就是說當我們左移1位時相當與除了個2倍

注意:

對於移位運運算元,不要移動負數位,這個是標準未定義的。

3 位元運算符

& //按位元與

| //按位元或

^ //按位元互斥或

注:他們的運算元必須是整數。

我們這些位元運算符都是針對運算元的二補數進行操作的

&操作符

作用:對於二進位制數,都為0才為0都為1才為1

程式碼舉例:

#include<stdio.h>
int main()
{
	int a = 5;
//00000000000000000000000000000101  5的二補數
	int b = -3;
//10000000000000000000000000000011  3的原碼
//11111111111111111111111111111100  3的反碼
//11111111111111111111111111111101  3的二補數
	int c = a & b;
//00000000000000000000000000000101  5的二補數
//11111111111111111111111111111101  3的二補數
// &的作用是二進位制數,都為0才為0都為1才為1
//00000000000000000000000000000101  c的二補數
	printf("a = %dn", a);
	printf("b = %dn", b);
	printf("c = %dn", c);
	return 0;
}

|按位元或

作用:二進位制位中有一個為1就為1,

^按位元互斥或

作用:二進位制位中相異置1,相同為置0

大家知道這些操作符的作用了,我們來做到題目來實戰一下吧。

題目1:不能建立臨時變數(第三個變數),實現兩個數的交換

程式碼實現:

#include<stdio.h>
int main()
{
	int a = 2;
	//0010
	int b = 3;
	//0011
	printf("交換前a = %d,b = %d n", a, b);
	a = a ^ b;
	//a的值0001
	b = a ^ b;
	//b的值0010(2)
	a = a ^ b;
	//a的值0011(3)
	printf("交換後a = %d,b = %dn", a, b);
	return 0;
}

題目2:編寫程式碼實現:求一個整數儲存在記憶體中的二進位制中1的個數。

程式碼實現:

//num&1便會找到二進位制最低位是否為1
#include<stdio.h>
int main()
{
	int num = -1;
	int i = 0;
	int count = 0;//計數
	for (i = 0;i < 32;i++)
	{
		if (num & (1 << i))
		{
			count++;
		}
	}
	printf("二進位制數中1的個數:count = %dn", count);
	return 0;
}

總結:

我們要想看二進位制中的最低位是1還0,我們就可以通過&1來實現。

4 賦值操作符

=

這個操作符是用來賦值的,我們要於‘==’區分,這個是用來表示相等的,大家是否在程式設計的時候會弄錯呢?下面教大家一種寫法可以在很大程度上避免這種錯誤。

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int a = 1;
	if (1 == a)
	{
		printf("可以避免錯誤n");
	}
}

要是我們寫成1=a,就會報下面的錯誤,這樣我們就能夠及時的改正自己的錯誤,是不是很好呢。

複合賦值符

+=

-=

*=

/=

%=

>>=

<<=

&=

|=

^=

這些都是=操作符的複合形式,舉個例子。

a+=10;就相當於a=a+10;

a-=10;就相當於a=a-10;

5 單目操作符

! 邏輯反操作

- 負值

+ 正值

& 取地址

sizeof 運算元的型別長度(以位元組為單位)

~ 對一個數的二進位制按位元取反

-- 前置、後置--

++ 前置、後置++

* 間接存取操作符(解除參照操作符)

(型別) 強制型別轉換

單目操作符的操作對像是1個,下面我們來一一細說。

5.1 ! 邏輯反操作

就是讓真變假,假變真

程式碼舉例:

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 1;
	int c = !a;
	int d = !b;
	printf("c = %d,d = %dn", c, d);
	return 0;
}

5.2 sizeof 和陣列

sizeof是用來求運算元的型別長度(以位元組為單位)

下面我們來看到這段程式碼

#include <stdio.h>
void test1(int arr[])
{
	printf("%dn", sizeof(arr));//(2)
}
void test2(char ch[])
{
	printf("%dn", sizeof(ch));//(4)
}
int main()
{
	int arr[10] = { 0 };
	char ch[10] = { 0 };
	printf("%dn", sizeof(arr));//(1)
	printf("%dn", sizeof(ch));//(3)
	test1(arr);
	test2(ch);
	return 0;
}

他們的結果分別是 40 10 4 4,為什麼呢?

第一個我們求的是整的陣列的大小,arr有10個元素,每個元素都是整形,所有陣列的大小為40個位元組。

第二個ch有10個元素,每給個元素為char 型別,所以ch陣列大小為10位元組

第三個和第四個傳的是陣列名(本質上都是首元素地址),那麼對於test1和test2應該用指標來接收,所以在test1和test2其實求的是指標的大小,在32平臺,指標的大小應該為4個位元組。

6 關係操作符

>

>=

< <=

!= 用於測試“不相等”

== 用於測試“相等”

7 邏輯操作符

&& 邏輯與

|| 邏輯或

用一道例題來說明邏輯操作符

#include <stdio.h>
int main()
{
    int i = 0, a = 0, b = 2, c = 3, d = 4;
    i = a++ && ++b && d++;
    //i = a++||++b||d++;
    printf("a = %dn b = %dn c = %dnd = %dn", a, b, c, d);
    return 0;
}

為什麼b= 2,c= 3,d =4呢?我們不是進行來對bcd進行了前置++或者後置++的操作嗎?

這是因為對於&&來說只要他的左表示式為假了,後面就不在執行。

而對於||來說只要左表示式為真,後面就不在執行了

8 條件操作符

xp1 ? exp2 : exp3

這個意思就是如果xp1為真,就執行exp2,否則就執行exp3。

9 逗號表示式

exp1, exp2, exp3,.......expN

逗號表示式,就是用逗號隔開的多個表示式。

逗號表示式,從左向右依次執行。整個表示式的結果是最後一個表示式的結果。

10 下標參照函數呼叫和結構成員

10.1 [ ]下標參照操作符

運算元:一個陣列名 + 一個索引值

對於一個已經初始化的陣列來說,arr[7]和7[arr]及*(arr+7)都是等價的。

#include<stdio.h>
int main()
{
	int arr[10] = { 0 };
	arr[7] = 5;
	printf("arr[7] = %dn", arr[7]);
	7[arr] = 6;
	printf("arr[7] = %dn", arr[7]);
	*(arr + 7) = 7;
	printf("arr[7] = %dn", arr[7]);
	return 0;
}

10.2 ()函數呼叫操作符

接受一個或者多個運算元:第一個運算元是函數名,剩餘的運算元就是傳遞給函數的引數。

10.3 存取一個結構的成員

. 結構體.成員名

-> 結構體指標->成員名

11 表示式求值

對於一給表示式我們一般要考慮它的計算操作符的優先順序和結合性,當表示式進行求值的時候還可能會發生整形提升。

11.1 整形提升

什麼是整形提升呢?就是在計算的計算的過程中都是預設以整形的方式進行計算的,當我是char型別參與計算時候就要發生整形提升。

整形提升規則:

負數的整形提升

char c1 = -1;

變數c1的二進位制位(二補數)中只有8個位元位:

1111111

因為 char 為有符號的 char

所以整形提升的時候,高位補充符號位,即為1

提升之後的結果是: 11111111111111111111111111111111

正數的整形提升

char c2 = 1;

變數c2的二進位制位(二補數)中只有8個位元位:

00000001

因為 char 為有符號的 char 所以整形提升的時候,高位補充符號位,即為0

提升之後的結果是: 00000000000000000000000000000001

無符號整形提升,高位補0

11.2 優先順序和結合性

對於應該複雜表示式的求值有三個影響的因素。

1. 操作符的優先順序

2. 操作符的結合性

3. 是否控制求值順序。

兩個相鄰的操作符先執行哪個?取決於他們的優先順序。如果兩者的優先順序相同,取決於他們的結合性。

那麼我們知道了解複雜表示式的3個元素,那麼表示式求數的結果一定說唯一的嗎?

下面我們來看到問題表示式:

int c = 1;

int b = c+ --c;

請問b中的值是什麼?

b=1?b=0?為什麼二個結果呢?

對--操作符的優先順序是比+高的,但是並沒有規定系統是怎麼給C準備空間的,如果開始為就表達中的c開闢了空間,那麼結果就為1,如果是在--c之後在開闢空間的,那麼結果就為0。

這些問題表示式我們要謹防在我們的程式碼中出現。

總結

對於這些操作符,不是看完這篇部落格將能掌握的,大家還是要在寫程式碼多練習。

到此這篇關於C語言各類操作符全面講解的文章就介紹到這了,更多相關C語言操作符內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com