初始C語(yǔ)言(操作符詳解)-創(chuàng)新互聯(lián)

點(diǎn)擊查看簡(jiǎn)單基礎(chǔ)版操作符介紹

成都創(chuàng)新互聯(lián)公司是一家專(zhuān)注于做網(wǎng)站、網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),岷縣網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:岷縣等地區(qū)。岷縣做網(wǎng)站價(jià)格咨詢:18980820575文章目錄
  • 1.??算術(shù)操作符
  • 2.??賦值操作符
  • 3.??關(guān)系操作符
  • 4.??單目操作符
  • 5.??條件操作符(三目操作符)
  • 6.??位操作符(操作數(shù)只能是整數(shù))
    • 6.1 前情提要
        • 【1】進(jìn)制
        • 【2】2進(jìn)制三種表現(xiàn)形式解析
        • 【3】unsigned和signed
    • 6.2 &按位與
    • 6.3 | 按位或
    • 6.4 ^按位異或
  • 7.??移位操作符(操作數(shù)只能是正整數(shù))
  • 8.??邏輯操作符
  • 9.??逗號(hào)表達(dá)式
  • 10.??表達(dá)式求值
    • 10.1 表達(dá)式求值的順序
    • 10.2 類(lèi)型轉(zhuǎn)換
      • 【1】隱性類(lèi)型轉(zhuǎn)換
      • 【2】尋常算術(shù)轉(zhuǎn)換

1.??算術(shù)操作符
  • 加法(+)、減法(-)、乘法(*):計(jì)算和正常的數(shù)學(xué)運(yùn)算一樣,整數(shù)和小數(shù)都沒(méi)有任何問(wèn)題
  • 除法(/):
    • 兩個(gè)操作數(shù)都是整數(shù),執(zhí)行整數(shù)除法,如果有一個(gè)是浮點(diǎn)類(lèi)型的,就執(zhí)行浮點(diǎn)數(shù)除法
    • 除數(shù)是不能為0的
  • 取余(%)兩邊只能放整數(shù)
2.??賦值操作符
  • 簡(jiǎn)單賦值
    • = ? ???????a = 3;????????把3賦值給a
  • 運(yùn)算之后再賦值(復(fù)合賦值符)
    • 理解:+=???????a+=3;????????a+3后的值再賦給a,相當(dāng)于a = a + 3;
    • +=、-=、*= 、/=、%=、>>=、<<=、&=、|=、^=
3.??關(guān)系操作符
  • 判斷大小
    • < 小于??????>大于??????>=大于等于??????<=小于等于
  • 判斷是否相等
    • ==相等??????!=不等
4.??單目操作符
  • ! 反邏輯操作符
    • 會(huì)把真的變成假,假的變成真
      • 補(bǔ)充,布爾類(lèi)型(C99中引入,部分編譯器支持,包括VS2019)-----表示真假的類(lèi)型
#include  //頭文件
_Bool flag = true;        //賦值,賦值的選項(xiàng)只有true和false兩種選擇
_Bool flag = false;

return false;         //返回的也只有這兩種選項(xiàng)
  • 前后置++/- -
    • 前后置的區(qū)別就是,是先使用還是先變化
    • 比如前置++就是先自增1,再使用加過(guò)后的這個(gè)變量的值
    • 會(huì)有副作用:會(huì)作用于自身
#includeint main()
{int a = 10;
	int b = ++a;     //b = 11  a = 11
	int c = a + 1;   //c = 11   a  = 10    
	return 0;
}

a+1和++a都可以實(shí)現(xiàn)打出這個(gè)數(shù)+1的效果,但是a+1是不會(huì)改變a本身的數(shù)值的,也就是所是不會(huì)作用于自身的

  • &取地址和*解引用
    • &取地址就是把某一個(gè)變量的地址取出來(lái)
    • *解引用就是根據(jù)地址去找那個(gè)變量從而直接修改變量的值
int a = 3;
	int* pa = &a;
	*pa += 3;       //*pa相當(dāng)于a
	printf("%d\n", *pa);
	printf("%d\n", a);    //因?yàn)槭亲饔迷赼上的值修改,所以可以直接打印a

    *(int *)地址——————指針是不能強(qiáng)制轉(zhuǎn)換的,,相當(dāng)于入室盜竊,不可取 

    char* p = "abcdef";     //這個(gè)是字符串字面量,傳進(jìn)去的是首個(gè)元素的地址
  • sizeof操作數(shù)的類(lèi)型長(zhǎng)度(以字節(jié)為單位)———可以求變量(類(lèi)型)所占空間的大小
  • 返回的是無(wú)符號(hào)的整型(unsigned int)
    【1】數(shù)組和一般變量
    😊大小計(jì)算以及一些是否可以省略括號(hào)的問(wèn)題:
#includeint main()
{int a = 3;
	int arr[10];
	printf("%d", sizeof(a));       //ok
	printf("%d", sizeof(int));    //ok
	printf("%d", sizeof(arr));    //ok
	printf("%d", sizeof(int [10]));    //ok
	printf("%d", sizeof a);       //ok    //如果是求變量的大小,可以省略括號(hào)
	//printf("%d", sizeof int);     //error    //如果是求類(lèi)型的大小,則不能省略括號(hào)
	return 0;
}

😊sizeof的特點(diǎn)

#includeint main()
{int a = 0;
	short s = 5;
	printf("%d\n", sizeof(s = a + 3));    //a+3是整型4個(gè)字節(jié),放在短整型2個(gè)字節(jié)里面會(huì)發(fā)生截?cái)?	printf("%d\n", sizeof(s));    //sizeof內(nèi)部的表達(dá)式不計(jì)算,s未被賦值,依舊是5
	return 0;
}

【2】sizeof和數(shù)組
😊大小計(jì)算

#includevoid test1(int arr[])
{printf("%d\n", sizeof(arr));     //4、8  
}
void test2(char* ch[])
{printf("%d\n", sizeof(ch));   //4、8,因?yàn)榻邮盏氖堑刂?,指針變量的大小要?要么8,取決是32位還是64位環(huán)境
}
int main()
{int arr[10] = {0 };
	char ch[10] = {0 };
	printf("%d\n", sizeof(arr));   //輸出40,計(jì)算的是整個(gè)數(shù)組的大小
	printf("%d\n", sizeof(ch));    //輸出10,計(jì)算的是整個(gè)數(shù)組的大小
	test1(arr);
	test2(ch);
	return 0;
}
  • 下標(biāo)引用操作符[ ]
    • 在一個(gè)數(shù)組里面要訪問(wèn)某一個(gè)元素就要用這個(gè)
    • 如arr[10],訪問(wèn)的是在arr數(shù)組中,下標(biāo)為9的元素,操作數(shù)是arr和10
  • 函數(shù)調(diào)用操作符
    • strlen(“abcdef");??????操作數(shù)是strlen和"abcedf",即第一個(gè)是操作數(shù)是函數(shù)名,剩余的操作數(shù)就是傳遞給函數(shù)的參數(shù)
    • 函數(shù)調(diào)用操作符,最少有一個(gè)操作符,即函數(shù)里面沒(méi)有參數(shù)的時(shí)候
  • 結(jié)構(gòu)體訪問(wèn)操作符
    • 結(jié)構(gòu)體變量.成員名
    • 結(jié)構(gòu)體指針->成員名
#includestruct book
{   //如何創(chuàng)建一個(gè)類(lèi)型
	char name[10];
	char author[10];
	int price;
};
int main()
{struct book b1 = {"《活著》","余華",45 };
	struct book* pb = &b1;
	printf("%s %s %d\n", b1.name, b1.author, b1.price);
	printf("%s %s %d\n", (*pb).name,(*pb).author, (*pb).price);   //用指針
	printf("%s %s %d\n", pb->name, pb->author, pb->price);
	return 0;
}
  • ~ 取反操作符:包括符號(hào)位都要取反
  • +正值(基本沒(méi)什么用)
  • -負(fù)值,把正數(shù)改成負(fù)數(shù),負(fù)數(shù)改成正數(shù)
  • (類(lèi)型)強(qiáng)制類(lèi)型轉(zhuǎn)換
#includeint main()
{int a = 3.14;       //3.14是浮點(diǎn)型,放到整型里面會(huì)丟失數(shù)據(jù),但非要放就需要強(qiáng)制類(lèi)型轉(zhuǎn)換
	printf("%d",a);    //printf和scanf是以某種格式輸出/輸入的意思,不需要強(qiáng)制類(lèi)型轉(zhuǎn)換,已經(jīng)自身帶領(lǐng)隱性的意味了
	return 0;
}
5.??條件操作符(三目操作符)
  • 表達(dá)式1?表達(dá)式2:表達(dá)式3

如果表達(dá)式1成立,就輸出表達(dá)式2的結(jié)果,如果表達(dá)式1不成立,就輸入表達(dá)式3的結(jié)果

6.??位操作符(操作數(shù)只能是整數(shù)) 6.1 前情提要 【1】進(jìn)制

位操作符,這個(gè)位究竟是什么?------二進(jìn)制位

計(jì)算機(jī)中有許多進(jìn)制的位,如常見(jiàn)的二進(jìn)制、八進(jìn)制、十六進(jìn)制等,我們看到的數(shù)值往往是以十進(jìn)制的形式展現(xiàn)的,每一個(gè)數(shù)值可以用不同的進(jìn)制表示,如

1111——二進(jìn)制位??????????????????表示的都是一個(gè)數(shù)。表現(xiàn)形式不同罷了
17——八進(jìn)制位
15——十進(jìn)制位
F——十六進(jìn)制位

【2】2進(jìn)制三種表現(xiàn)形式解析

而計(jì)算機(jī)中二進(jìn)制的表現(xiàn)形式一共有三種:原碼、反碼、補(bǔ)碼

  • 原碼就是根據(jù)數(shù)值的大小和正反直接寫(xiě)出的32位或者64位二進(jìn)制
    原碼的最高位是符號(hào)位,如果是0就表示是正數(shù),如果是1就表示是負(fù)數(shù)
  • 反碼就是原碼除了符號(hào)位,其他位按位取反
  • 補(bǔ)碼就是反碼+1

正數(shù)(包括0)的原碼、反碼、補(bǔ)碼相同,負(fù)數(shù)的則需要計(jì)算

內(nèi)存中存的是補(bǔ)碼,所以移位什么的,移的是補(bǔ)碼。

打印是按原碼來(lái)

【3】unsigned和signed

unsigned:整數(shù)在內(nèi)存中以二進(jìn)制的補(bǔ)碼存儲(chǔ),最高位為符號(hào)位,這個(gè)可以實(shí)現(xiàn)最高位成為計(jì)算位,不是符號(hào)位——————無(wú)符號(hào)位

signed:因?yàn)槭悄J(rèn)數(shù)值存儲(chǔ)時(shí)有符號(hào)位的,所以基本省略掉了——————有符號(hào)位

6.2 &按位與

對(duì)應(yīng)的二進(jìn)制位有0,則為0,除非兩個(gè)數(shù)都是1,才為1

6.3 | 按位或

對(duì)應(yīng)的二進(jìn)制位,有1就為1,除非兩個(gè)數(shù)都是0,才為0

6.4 ^按位異或

對(duì)應(yīng)的二進(jìn)制位,相同為0,相異為1

7.??移位操作符(操作數(shù)只能是正整數(shù))

左移操作符:左邊拋棄,右邊補(bǔ)0
右移操作符:左邊用原該位的符號(hào)位填充,右邊丟棄

int a = 1<<4;    //把1向左移動(dòng)4位的數(shù),賦值給a   //左移操作符
int b = 1>>4;    //把1向右移動(dòng)4位的數(shù),賦值給b   //右移操作符

int num = 10;
int b = num<<1;     //num本身的值沒(méi)有被改變
8.??邏輯操作符

&& 邏輯與?????||邏輯或
區(qū)分:& 按位與?????|按位或

特點(diǎn)(坑點(diǎn)):
&&操作符:左邊為假,右邊無(wú)須計(jì)算
||操作符:左邊為真,右邊無(wú)須計(jì)算

邏輯操作符可以產(chǎn)生短路的效果

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

形式:表達(dá)式1,表達(dá)式2,表達(dá)式3……表達(dá)式n

含義:用逗號(hào)隔開(kāi)的多個(gè)表達(dá)式

特點(diǎn):從左向右依次執(zhí)行,整個(gè)表達(dá)式的結(jié)果就是最后一個(gè)表達(dá)式的結(jié)果

#includeint main()
{int a = 1;
	int b = 2;
	int c = 0;
	if (a = b + 1, c = a / 2, b >0)    //依次執(zhí)行,前面如果有涉及值的修改,也會(huì)影響判斷部分,真正起到判斷部分的,是最后一個(gè)表達(dá)式,即b>0
	{printf("大悲咒");
	}
	return 0;
}
10.??表達(dá)式求值

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

10.1 表達(dá)式求值的順序

?如何判斷計(jì)算順序【注意:相鄰的概念】

  • 首先確定優(yōu)先級(jí),相鄰操作符按照優(yōu)先級(jí)高低計(jì)算
  • 然后優(yōu)先級(jí)相同的情況下,結(jié)合性才會(huì)起作用
  • 最后看是否控制求值順序

?一些問(wèn)題表達(dá)式

雖然通過(guò)上述方法可以確定計(jì)算順序,但是這個(gè)計(jì)算順序并不是唯一的,下面介紹一些問(wèn)題表達(dá)式

第一種
a* b + c * d + e * f;  優(yōu)先級(jí)只能確定相鄰操作符的順序,無(wú)法確定第三個(gè)*是否比第一個(gè)+早執(zhí)行

第二種
c + --c; 無(wú)法確定c是什么時(shí)候準(zhǔn)備好的,是在減減前就準(zhǔn)備好了
第三種  非法表達(dá)式
#includeint main()
{int i = 10;
	i = i-- - --i * (i = -3) * i++ + ++i;
	printf("i = %d\n", i);
	return 0;
}

第四種
#includeint fun()
{static int count = 1;
	return ++count;
}
int main()
{int answer;
	answer = fun() - fun() * fun();   //只能確定先算乘法,再算減法,但是函數(shù)的調(diào)用順序是無(wú)法確定的
	printf("%d\n", answer);
	return 0;
}

😊總結(jié)
優(yōu)先級(jí)高并不代表表達(dá)式執(zhí)行順序優(yōu)先,就像a+f+bc,它可以是先a+f再加bc,它也可以先a+f再加bc,也可以是bc再加a。

沒(méi)法確定唯一計(jì)算路徑的就是問(wèn)題表達(dá)式,我們要通過(guò)括號(hào)去避免

10.2 類(lèi)型轉(zhuǎn)換 【1】隱性類(lèi)型轉(zhuǎn)換

為什么會(huì)出現(xiàn)隱性類(lèi)型轉(zhuǎn)換這種情況?

?因?yàn)楸磉_(dá)式的整型運(yùn)算要在CPU的整型運(yùn)算器里面進(jìn)行,而里面運(yùn)算的操作數(shù)的字節(jié)長(zhǎng)度一般是整型的字節(jié)長(zhǎng)度。

即C語(yǔ)言的整數(shù)算術(shù)運(yùn)算默認(rèn)是以整型類(lèi)型的精度來(lái)進(jìn)行的

?但是字符和短整型的字節(jié)長(zhǎng)度是小于int類(lèi)型的,為了達(dá)到上述所提到的要求,就需要進(jìn)行整型提升,即在執(zhí)行運(yùn)算前,要把把字符類(lèi)型、短整型轉(zhuǎn)化成int類(lèi)型或者unsigned int類(lèi)型后,才送去CPU執(zhí)行運(yùn)算操作

隱性類(lèi)型轉(zhuǎn)換是如何進(jìn)行的

char a = 1;    b和c先被提升為普通整型,然后再執(zhí)行加法運(yùn)算
char b = -1;
a = b + c;       執(zhí)行完加法運(yùn)算之后,結(jié)果將被截?cái)啵缓蟊淮鎯?chǔ)到a中
  • 概況
    • b和c先被提升為普通整型,然后再執(zhí)行加法運(yùn)算
    • 執(zhí)行完加法運(yùn)算之后,結(jié)果將被截?cái)?,然后被存?chǔ)到a中
  • 如何被提升為普通整型
    • a為1,而且是char類(lèi)型只有8個(gè)比特位,寫(xiě)成2進(jìn)制的補(bǔ)碼是00000001,整型提升之后,因?yàn)槭怯蟹?hào)的char,高位補(bǔ)充符號(hào)位0,即000000000000000000000001
    • b為-1,補(bǔ)碼是11111111,因?yàn)槭怯蟹?hào)的char,高位補(bǔ)充符號(hào)位1,所以結(jié)果是11111111111111111111111111111111
【2】尋常算術(shù)轉(zhuǎn)換

?使用場(chǎng)景:某個(gè)操作符的各個(gè)操作數(shù)屬于不同的類(lèi)型

?解決方法:其中一個(gè)操作數(shù)的轉(zhuǎn)換為另一個(gè)操作數(shù)的類(lèi)型,否則操作(運(yùn)算)無(wú)法進(jìn)行

  • ong double
  • double
  • float
  • unsigned long int
  • long int
  • unsigned int
  • int

?具體:排名較低的那個(gè)類(lèi)型要首先轉(zhuǎn)換為另外一個(gè)操作數(shù)的類(lèi)型后執(zhí)行運(yùn)算

????就高不就低

?轉(zhuǎn)換要合理,如果你強(qiáng)行給整型類(lèi)型賦上一個(gè)浮點(diǎn)數(shù),會(huì)發(fā)生精度的丟失

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站欄目:初始C語(yǔ)言(操作符詳解)-創(chuàng)新互聯(lián)
URL標(biāo)題:http://muchs.cn/article26/dhgcjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、品牌網(wǎng)站設(shè)計(jì)、域名注冊(cè)網(wǎng)站維護(hù)、外貿(mào)建站、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)