欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言各類(lèi)操作符全面講解

 更新時(shí)間:2022年05月30日 10:36:56   作者:^O^玩轉(zhuǎn)編程  
C?語(yǔ)言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符等。接下了讓我們?cè)敿?xì)了解掌握它

1 算術(shù)操作符

+ - * / %

+,-和*操作數(shù)我就不多說(shuō)了,這里我們重點(diǎn)來(lái) / 和%

/操作數(shù)

作用:就是求商

注意點(diǎn):

1 二邊的操作數(shù)都是整形,商的結(jié)果就為整數(shù)

2 二邊的操作數(shù)有一個(gè)是浮點(diǎn)型結(jié)果就為小數(shù)

%操作數(shù)

作用:求余數(shù)

注意點(diǎn):. % 操作符的兩個(gè)操作數(shù)必須為整數(shù)。返回的是整除之后的余數(shù)。

2 移位操作符

<< 左移操作符

>> 右移操作符

注意:移位操作符移的是二進(jìn)制位,且操作數(shù)只能是整數(shù)

<< 左移操作符

規(guī)則:左邊拋棄、右邊補(bǔ)0

代碼舉例:

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

當(dāng)a<<1時(shí)

當(dāng)a<<2時(shí)

當(dāng)a<<3時(shí)

總結(jié):

1 操作數(shù)被移位操作符操作后其值仍然不變

2 計(jì)算機(jī)存儲(chǔ)的都是補(bǔ)碼,而打印出來(lái)的是原碼所對(duì)應(yīng)的值

3 b=a<<n時(shí),b的值位a*2^n,也就是說(shuō)當(dāng)我們左移1位時(shí)相當(dāng)與乘了個(gè)2倍

>> 右移操作符

移位規(guī)則: 首先右移運(yùn)算分兩種:

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

2. 算術(shù)移位 左邊用原該值的符號(hào)位填充,右邊丟棄

代碼舉例:

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

當(dāng)a>>1時(shí)

當(dāng)a>>2時(shí)

當(dāng)a>>3時(shí)

總結(jié):

1 右移操作和左移操作是本質(zhì)都是對(duì)補(bǔ)碼的二進(jìn)制位進(jìn)行操作

2 b=a>>n時(shí),b的值位a/2^n,也就是說(shuō)當(dāng)我們左移1位時(shí)相當(dāng)與除了個(gè)2倍

注意:

對(duì)于移位運(yùn)算符,不要移動(dòng)負(fù)數(shù)位,這個(gè)是標(biāo)準(zhǔn)未定義的。

3 位操作符

& //按位與

| //按位或

^ //按位異或

注:他們的操作數(shù)必須是整數(shù)。

我們這些位操作符都是針對(duì)操作數(shù)的補(bǔ)碼進(jìn)行操作的

&操作符

作用:對(duì)于二進(jìn)制數(shù),都為0才為0都為1才為1

代碼舉例:

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

|按位或

作用:二進(jìn)制位中有一個(gè)為1就為1,

^按位異或

作用:二進(jìn)制位中相異置1,相同為置0

大家知道這些操作符的作用了,我們來(lái)做到題目來(lái)實(shí)戰(zhàn)一下吧。

題目1:不能創(chuàng)建臨時(shí)變量(第三個(gè)變量),實(shí)現(xiàn)兩個(gè)數(shù)的交換

代碼實(shí)現(xiàn):

#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 = %d\n", a, b);
	return 0;
}

題目2:編寫(xiě)代碼實(shí)現(xiàn):求一個(gè)整數(shù)存儲(chǔ)在內(nèi)存中的二進(jìn)制中1的個(gè)數(shù)。

代碼實(shí)現(xiàn):

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

總結(jié):

我們要想看二進(jìn)制中的最低位是1還0,我們就可以通過(guò)&1來(lái)實(shí)現(xiàn)。

4 賦值操作符

=

這個(gè)操作符是用來(lái)賦值的,我們要于‘==’區(qū)分,這個(gè)是用來(lái)表示相等的,大家是否在編程的時(shí)候會(huì)弄錯(cuò)呢?下面教大家一種寫(xiě)法可以在很大程度上避免這種錯(cuò)誤。

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

要是我們寫(xiě)成1=a,就會(huì)報(bào)下面的錯(cuò)誤,這樣我們就能夠及時(shí)的改正自己的錯(cuò)誤,是不是很好呢。

復(fù)合賦值符

+=

-=

*=

/=

%=

>>=

<<=

&=

|=

^=

這些都是=操作符的復(fù)合形式,舉個(gè)例子。

a+=10;就相當(dāng)于a=a+10;

a-=10;就相當(dāng)于a=a-10;

5 單目操作符

! 邏輯反操作

- 負(fù)值

+ 正值

& 取地址

sizeof 操作數(shù)的類(lèi)型長(zhǎng)度(以字節(jié)為單位)

~ 對(duì)一個(gè)數(shù)的二進(jìn)制按位取反

-- 前置、后置--

++ 前置、后置++

* 間接訪問(wèn)操作符(解引用操作符)

(類(lèi)型) 強(qiáng)制類(lèi)型轉(zhuǎn)換

單目操作符的操作對(duì)像是1個(gè),下面我們來(lái)一一細(xì)說(shuō)。

5.1 ! 邏輯反操作

就是讓真變假,假變真

代碼舉例:

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

5.2 sizeof 和數(shù)組

sizeof是用來(lái)求操作數(shù)的類(lèi)型長(zhǎng)度(以字節(jié)為單位)

下面我們來(lái)看到這段代碼

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

他們的結(jié)果分別是 40 10 4 4,為什么呢?

第一個(gè)我們求的是整的數(shù)組的大小,arr有10個(gè)元素,每個(gè)元素都是整形,所有數(shù)組的大小為40個(gè)字節(jié)。

第二個(gè)ch有10個(gè)元素,每給個(gè)元素為char 類(lèi)型,所以ch數(shù)組大小為10字節(jié)

第三個(gè)和第四個(gè)傳的是數(shù)組名(本質(zhì)上都是首元素地址),那么對(duì)于test1和test2應(yīng)該用指針來(lái)接收,所以在test1和test2其實(shí)求的是指針的大小,在32平臺(tái),指針的大小應(yīng)該為4個(gè)字節(jié)。

6 關(guān)系操作符

>

>=

< <=

!= 用于測(cè)試“不相等”

== 用于測(cè)試“相等”

7 邏輯操作符

&& 邏輯與

|| 邏輯或

用一道例題來(lái)說(shuō)明邏輯操作符

#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 = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
    return 0;
}

為什么b= 2,c= 3,d =4呢?我們不是進(jìn)行來(lái)對(duì)bcd進(jìn)行了前置++或者后置++的操作嗎?

這是因?yàn)閷?duì)于&&來(lái)說(shuō)只要他的左表達(dá)式為假了,后面就不在執(zhí)行。

而對(duì)于||來(lái)說(shuō)只要左表達(dá)式為真,后面就不在執(zhí)行了

8 條件操作符

xp1 ? exp2 : exp3

這個(gè)意思就是如果xp1為真,就執(zhí)行exp2,否則就執(zhí)行exp3。

9 逗號(hào)表達(dá)式

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

逗號(hào)表達(dá)式,就是用逗號(hào)隔開(kāi)的多個(gè)表達(dá)式。

逗號(hào)表達(dá)式,從左向右依次執(zhí)行。整個(gè)表達(dá)式的結(jié)果是最后一個(gè)表達(dá)式的結(jié)果。

10 下標(biāo)引用函數(shù)調(diào)用和結(jié)構(gòu)成員

10.1 [ ]下標(biāo)引用操作符

操作數(shù):一個(gè)數(shù)組名 + 一個(gè)索引值

對(duì)于一個(gè)已經(jīng)初始化的數(shù)組來(lái)說(shuō),arr[7]和7[arr]及*(arr+7)都是等價(jià)的。

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

10.2 ()函數(shù)調(diào)用操作符

接受一個(gè)或者多個(gè)操作數(shù):第一個(gè)操作數(shù)是函數(shù)名,剩余的操作數(shù)就是傳遞給函數(shù)的參數(shù)。

10.3 訪問(wèn)一個(gè)結(jié)構(gòu)的成員

. 結(jié)構(gòu)體.成員名

-> 結(jié)構(gòu)體指針->成員名

11 表達(dá)式求值

對(duì)于一給表達(dá)式我們一般要考慮它的計(jì)算操作符的優(yōu)先級(jí)和結(jié)合性,當(dāng)表達(dá)式進(jìn)行求值的時(shí)候還可能會(huì)發(fā)生整形提升。

11.1 整形提升

什么是整形提升呢?就是在計(jì)算的計(jì)算的過(guò)程中都是默認(rèn)以整形的方式進(jìn)行計(jì)算的,當(dāng)我是char類(lèi)型參與計(jì)算時(shí)候就要發(fā)生整形提升。

整形提升規(guī)則:

負(fù)數(shù)的整形提升

char c1 = -1;

變量c1的二進(jìn)制位(補(bǔ)碼)中只有8個(gè)比特位:

1111111

因?yàn)?char 為有符號(hào)的 char

所以整形提升的時(shí)候,高位補(bǔ)充符號(hào)位,即為1

提升之后的結(jié)果是: 11111111111111111111111111111111

正數(shù)的整形提升

char c2 = 1;

變量c2的二進(jìn)制位(補(bǔ)碼)中只有8個(gè)比特位:

00000001

因?yàn)?char 為有符號(hào)的 char 所以整形提升的時(shí)候,高位補(bǔ)充符號(hào)位,即為0

提升之后的結(jié)果是: 00000000000000000000000000000001

無(wú)符號(hào)整形提升,高位補(bǔ)0

11.2 優(yōu)先級(jí)和結(jié)合性

對(duì)于應(yīng)該復(fù)雜表達(dá)式的求值有三個(gè)影響的因素。

1. 操作符的優(yōu)先級(jí)

2. 操作符的結(jié)合性

3. 是否控制求值順序。

兩個(gè)相鄰的操作符先執(zhí)行哪個(gè)?取決于他們的優(yōu)先級(jí)。如果兩者的優(yōu)先級(jí)相同,取決于他們的結(jié)合性。

那么我們知道了解復(fù)雜表達(dá)式的3個(gè)元素,那么表達(dá)式求數(shù)的結(jié)果一定說(shuō)唯一的嗎?

下面我們來(lái)看到問(wèn)題表達(dá)式:

int c = 1;

int b = c+ --c;

請(qǐng)問(wèn)b中的值是什么?

b=1?b=0?為什么二個(gè)結(jié)果呢?

對(duì)--操作符的優(yōu)先級(jí)是比+高的,但是并沒(méi)有規(guī)定系統(tǒng)是怎么給C準(zhǔn)備空間的,如果開(kāi)始為就表達(dá)中的c開(kāi)辟了空間,那么結(jié)果就為1,如果是在--c之后在開(kāi)辟空間的,那么結(jié)果就為0。

這些問(wèn)題表達(dá)式我們要謹(jǐn)防在我們的代碼中出現(xiàn)。

總結(jié)

對(duì)于這些操作符,不是看完這篇博客將能掌握的,大家還是要在寫(xiě)代碼多練習(xí)。

到此這篇關(guān)于C語(yǔ)言各類(lèi)操作符全面講解的文章就介紹到這了,更多相關(guān)C語(yǔ)言操作符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析C和C++函數(shù)的相互引用

    淺析C和C++函數(shù)的相互引用

    C++是一種面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,為了支持函數(shù)的重載,C++對(duì)全局函數(shù)的處理方式與C有明顯的不同
    2013-10-10
  • C++ 靜態(tài)成員的類(lèi)內(nèi)初始化詳解及實(shí)例代碼

    C++ 靜態(tài)成員的類(lèi)內(nèi)初始化詳解及實(shí)例代碼

    這篇文章主要介紹了C++ 靜態(tài)成員的類(lèi)內(nèi)初始化詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • C/C++實(shí)現(xiàn)投骰子游戲

    C/C++實(shí)現(xiàn)投骰子游戲

    這篇文章主要為大家詳細(xì)介紹了C/C++實(shí)現(xiàn)投骰子游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • OpenCV圖像處理之直方圖比較方法詳解

    OpenCV圖像處理之直方圖比較方法詳解

    直方圖比較是對(duì)輸入的兩張圖像進(jìn)行計(jì)算得到直方圖H1與H2,歸一化到相同的尺度空間,然后可以通過(guò)計(jì)算H1與H2的之間的距離得到兩個(gè)直方圖的相似程度,進(jìn)而比較圖像本身的相似程度。本文將為大家詳細(xì)講講直方圖比較的實(shí)現(xiàn)方法,需要的可以參考一下
    2022-09-09
  • C++ float、double判斷是否等于0問(wèn)題

    C++ float、double判斷是否等于0問(wèn)題

    這篇文章主要介紹了C++ float、double判斷是否等于0問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • C++操作MySQL大量數(shù)據(jù)插入效率低下的解決方法

    C++操作MySQL大量數(shù)據(jù)插入效率低下的解決方法

    這篇文章主要介紹了C++操作MySQL大量數(shù)據(jù)插入效率低下的解決方法,需要的朋友可以參考下
    2014-07-07
  • makefile如何調(diào)用靜態(tài)庫(kù)的方法實(shí)現(xiàn)

    makefile如何調(diào)用靜態(tài)庫(kù)的方法實(shí)現(xiàn)

    這篇文章主要介紹了makefile如何調(diào)用靜態(tài)庫(kù)的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C++單例模式的懶漢模式和餓漢模式詳解

    C++單例模式的懶漢模式和餓漢模式詳解

    這篇文章主要為大家詳細(xì)介紹了C++懶漢模式和餓漢模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • return和break的區(qū)別解析

    return和break的區(qū)別解析

    這篇文章主要介紹了return和break的區(qū)別解析,需要的朋友可以參考下
    2014-02-02
  • VScode中添加頭文件和源文件(C/C++)的方法

    VScode中添加頭文件和源文件(C/C++)的方法

    使用VSCode編譯C/C++時(shí),會(huì)存在找不到頭文件的情況,下面這篇文章主要給大家介紹了關(guān)于VScode中添加頭文件和源文件(C/C++)的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08

最新評(píng)論