大家好我是Cbiltps,在我的博客中如果有難以理解的句意,難以用文字表達(dá)的重點(diǎn),我會(huì)有配圖。所以我的博客配圖非常重要!!!
如果你對(duì)我感興趣請(qǐng)看我的第一篇博客!
算數(shù)操作符有:
+ - * / %
除了%
操作符之外,其他的幾個(gè)操作符可以作用于整數(shù)和浮點(diǎn)數(shù)。
/
操作符#include int main(){ int ret = 9 / 2;//對(duì)于 /(除號(hào)) 兩邊都是整數(shù),執(zhí)行的整數(shù)除法 double ret2 = 9 / 2;//它的值是什么? double ret3 = 9 / 2.0;//它的值是什么? printf("%d/n", ret); printf("%lf/n", ret2); printf("%lf/n", ret3); return 0;}
運(yùn)行結(jié)果如下:
第二個(gè)結(jié)果還是4.0
,為什么呢?
因?yàn)椴僮鲾?shù)中有浮點(diǎn)數(shù),才執(zhí)行浮點(diǎn)數(shù)除法。
%
操作符%
操作符是取模操作符,也叫取余操作符。
int ret4 = 10 % 4;printf("%d", ret4);//打印出來(lái)是2
注意:%
操作符只能針對(duì)整形類(lèi)型
<< 左移操作符>> 右移操作符
<<
左移操作符int a = 5;int b = a << 1;printf("%d/n", b);//打印出來(lái)的是 10 //要看懂下面的圖解,要明白一些知識(shí)點(diǎn): //移位操作符,移動(dòng)的是二進(jìn)制位 //對(duì)于整數(shù)的二進(jìn)制有3中表示形式:原碼、反碼、補(bǔ)碼 //正整數(shù) - 原碼、反碼、補(bǔ)碼相同 //負(fù)整數(shù) //原碼 - 直接按照數(shù)字的正負(fù)寫(xiě)出的二進(jìn)制序列 //反碼 - 原碼的符號(hào)位不變,其他位按位取法得到的 //補(bǔ)碼 - 反碼+1 //整數(shù) 在內(nèi)存中存儲(chǔ)的是二進(jìn)制的補(bǔ)碼
如果是一個(gè)負(fù)數(shù)的話,看代碼:
int c = -1;int d = c << 1;printf("%d/n", d);//打印的是原碼的值,打印出來(lái)是 -2 //10000000000000000000000000000001 - 原碼 //11111111111111111111111111111110 - 反碼 //11111111111111111111111111111111 - 補(bǔ)碼
移位規(guī)則:左邊拋棄、右邊補(bǔ)0
關(guān)于原碼、反碼、補(bǔ)碼,請(qǐng)大家看我寫(xiě)的另一篇進(jìn)階博客!
>>
左移操作符移位規(guī)則:
1. 邏輯移位:左邊用0填充,右邊丟棄
2. 算術(shù)移位:左邊用原該值的符號(hào)位填充,右邊丟棄
舉例:
int a = 5;int b = a >> 1;printf("%d/n", b);//打印出來(lái)的是 2
再用負(fù)數(shù)舉個(gè)例子:
int c = -1;int d = c << 1;printf("%d/n", d);//打印出來(lái)還是 -1
在這里是補(bǔ)了原來(lái)的符號(hào)位,所以 VS2019 采用算術(shù)右移!
警告? :
1:對(duì)于移位運(yùn)算符,不要移動(dòng)負(fù)數(shù)位
,這個(gè)是標(biāo)準(zhǔn)未定義的。
2:不管是被移動(dòng)數(shù)
還是移動(dòng)的位數(shù)
都必須是整數(shù)。
例如(錯(cuò)誤演示):
int num = 10;num>>-1;//error
位操作符有:
&
按位與|
按位或^
按位異或注:他們的操作數(shù)必須是整數(shù)。
&
按位與操作符計(jì)算規(guī)則:
1:二進(jìn)制位上只要有0,那就是0
2:二進(jìn)制位上兩個(gè)同時(shí)為1,那就是1
int a = 3; int b = -2; int c = a & b; printf("%d/n", c);//打印出來(lái)是 2 //%d - 說(shuō)明我們要打印c的值,以有符號(hào)的形式 //00000000000000000000000000000011 -3的原碼 //11111111111111111111111111111110 -2的補(bǔ)碼 //00000000000000000000000000000010 這個(gè)數(shù)是2
|
按位或操作符計(jì)算規(guī)則: 二進(jìn)制位只要有1,就為1
int a = 3;int b = -2;int c = a | b;printf("%d/n", c);//打印 -1 //00000000000000000000000000000011 -3的原碼 //11111111111111111111111111111110 -2的補(bǔ)碼 //11111111111111111111111111111111 //11111111111111111111111111111111 補(bǔ)碼 //11111111111111111111111111111110 反碼 //10000000000000000000000000000001 原碼 它的值是-1
^
按位異或操作符計(jì)算規(guī)則: 二進(jìn)制位相同為0,相異為1
int a = 3;int b = -2;int c = a ^ b;//打印出來(lái)是 -3printf("%d/n", c); //00000000000000000000000000000011 -3的原碼 //11111111111111111111111111111110 -2的補(bǔ)碼 //11111111111111111111111111111101 //11111111111111111111111111111101 補(bǔ)碼 //11111111111111111111111111111100 反碼 //10000000000000000000000000000011 原碼 它的值是-3
一道{{BANNED}}的面試題:
不能創(chuàng)建臨時(shí)變量(第三個(gè)變量),實(shí)現(xiàn)兩個(gè)數(shù)的交換。
#include int main(){ int a = 3; int b = 5; printf("交換前:a=%d b=%d/n", a, b); a = a ^ b; b = a ^ b; a = a ^ b; printf("交換后:a=%d b=%d/n", a, b); return 0;}
思路圖解:
注意:這樣寫(xiě)代碼的可讀性不夠好,而且只適用于整型
賦值操作符可以讓你得到一個(gè)你之前不滿意的值,也就是你可以給自己重新賦值。
int weight = 120;//體重weight = 89;//不滿意就賦值double salary = 10000.0;salary = 20000.0;//使用賦值操作符賦值
賦值操作符可以連續(xù)使用,比如:
int a = 10;int x = 0;int y = 20;a = x = y + 1;//連續(xù)賦值
這樣的代碼感覺(jué)怎么樣?
那這樣寫(xiě):
x = y + 1;a = x;
更加清晰爽朗而且易于調(diào)試。
復(fù)合賦值符:
這些運(yùn)算符都可以寫(xiě)成復(fù)合的效果,比如:
int x = 10;x = x + 10;x += 10;//復(fù)合賦值
單目操作符就是只有一個(gè)操作數(shù)的操作符
!
邏輯反操作
-
負(fù)值
+
正值
&
取地址
&arr[0];//數(shù)組首元素的地址&arr[9];//取出的是第10個(gè)元素的地址&arr;//取出數(shù)組的地址
sizeof
操作數(shù)的類(lèi)型長(zhǎng)度(以字節(jié)為單位)
//以下幾種寫(xiě)法都是一樣的printf("%d/n", sizeof(a));//4printf("%d/n", sizeof a);//4printf("%d/n", sizeof(int));//4
//這里有一個(gè)問(wèn)題;int a = 5;short s = 10;printf("%d/n", sizeof(s = a + 2));//打印出來(lái)是 2printf("%d/n", s); //打印出來(lái)是 10 因?yàn)椋簊izeof 內(nèi)部的表達(dá)式不參與運(yùn)算
~
對(duì)一個(gè)數(shù)的二進(jìn)制按位取反
#incluide <stdio.h>int main(){ int a = 0; //00000000000000000000000000000000 int b = ~a; printf("%d/n", b); //00000000000000000000000000000000 //11111111111111111111111111111111 所有位按位取反 // //11111111111111111111111111111110 反碼 //10000000000000000000000000000001 原碼 //-1 return 0;}
--
前置、后置--
int a = 10;int b = a--;printf("%d/n", b);//這里打印出來(lái)還是 10
int a = 10;int b = --a;printf("%d/n", b);//這里打印出來(lái)才是9
++
前置、后置++
千萬(wàn)注意:不要這樣子寫(xiě)代碼(垃圾代碼),會(huì)被公司開(kāi)除的!
int main(){ int a = 1; int b = (++a) + (++a) + (++a);//err printf("b=%d/n", b); return 0;}
這里兩個(gè)編譯器下不一樣!
*
間接訪問(wèn)操作符(解引用操作符),可以和&
取地址搭配使用
(類(lèi)型
) 強(qiáng)制類(lèi)型轉(zhuǎn)換
int a = (int)3.14;//默認(rèn)寫(xiě)出的浮點(diǎn)數(shù)是double的,所以可以強(qiáng)制轉(zhuǎn)換printf("%d/n", a);return 0;
我們來(lái)看一個(gè)題,看它們分別輸出的是多少:
#include void test1(int arr[])//它的本質(zhì)數(shù)是(int* arr[]){ printf("%d/n", sizeof(arr));//傳的是首元素的地址}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));//數(shù)組名多帶帶放在sizeof內(nèi)部,數(shù)組名表示整個(gè)數(shù)組 printf("%d/n", sizeof(ch));//(3) test1(arr); test2(ch); return 0;}
輸出結(jié)果:
更多關(guān)于數(shù)組的知識(shí)請(qǐng)看我的上一篇博客!
關(guān)系操作符在同類(lèi)之間比較才有意義!
>
>=
<
<=
!=
用于測(cè)試“不相等”==
用于測(cè)試“相等”這些關(guān)系運(yùn)算符比較簡(jiǎn)單,沒(méi)什么可講的,但是我們要注意一些運(yùn)算符使用時(shí)候的陷阱。
注意:在編程的時(shí)候 =
和 ==
寫(xiě)錯(cuò),會(huì)導(dǎo)致出錯(cuò)!
&&
邏輯與int a = 0;int b = 3;int c = a && b;//只判斷真假,所以打印出來(lái)是 0
||
邏輯或int a = 0;int b = 3;int c = a || b;printf("%d/n", c);//打印出來(lái)是 1
來(lái)看一道 360 的筆試題:
#include 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);//打印出來(lái)的是1 2 3 4 return 0;}
思路圖解:
那如果是邏輯或的話:
#include int main(){ int i = 0, a = 0, b = 2, c = 3, d = 4; i = a++ || ++b || d++; printf(" a = %d/n b = %d /n c = %d/n d = %d/n", a, b, c, d);//打印錯(cuò)來(lái)的是1 3 3 4 return 0;}
思路圖解:
條件操作符也叫三目操作符
exp1 ? exp2 : exp3
int a = 0;int b = 0;if (a > 5) b = 3;else b = -3; //這里有更簡(jiǎn)單的寫(xiě)法:(a > 5) ? (b = 3) : (b = -3);//直接搞定
exp1, exp2, exp3, …expN
逗號(hào)表達(dá)式,就是用逗號(hào)隔開(kāi)的多個(gè)表達(dá)式。
逗號(hào)表達(dá)式規(guī)則:從左向右依次執(zhí)行,整個(gè)表達(dá)式的結(jié)果是最后一個(gè)表達(dá)式的結(jié)果
。
代碼演示:
//代碼1int a = 1;int b = 2;int c = (a>b, a=b+10, a, b=a+1);//c是多少?看的是最后一個(gè)表達(dá)式//代碼2if (a =b + 1, c=a / 2, d > 0)//最后一個(gè)表達(dá)式判斷的是 d > 0
//代碼3a = get_val();count_val(a);while (a > 0)//注意;這樣寫(xiě)非常的冗余{ //業(yè)務(wù)處理 a = get_val(); count_val(a);}//如果使用逗號(hào)表達(dá)式,改寫(xiě):while (a = get_val(), count_val(a), a > 0){ //業(yè)務(wù)處理}
[ ]
下標(biāo)引用操作符
操作數(shù):一個(gè)數(shù)組名 + 一個(gè)索引值
int arr[10];//創(chuàng)建數(shù)組arr[9] = 10;//實(shí)用下標(biāo)引用操作符。//[ ]的兩個(gè)操作數(shù)是arr和9。
//下面表達(dá)的意思都是相同的 arr[4] -- > *(arr+4) --> *(4+arr) --> 4[arr]
( )
函數(shù)調(diào)用操作符
接受一個(gè)或者多個(gè)操作數(shù):第一個(gè)操作數(shù)是函數(shù)名,剩余的操作數(shù)就是傳遞給函數(shù)的參數(shù)。
void test(){ printf("hehe/n");}int main(){ test();//這里就是函數(shù)調(diào)用操作符 return 0;}
結(jié)構(gòu)成員訪問(wèn)操作符
.
結(jié)構(gòu)變量.成員名->
結(jié)構(gòu)體指針->成員名#include struct Book{ char name[20]; float price; char id[10];};void print1(struct Book b){ printf("書(shū)名: %s/n", b.name);//在這里訪問(wèn)結(jié)構(gòu)體成員 printf("價(jià)格: %f/n", b.price); printf("書(shū)號(hào): %s/n", b.id); //*(b.name);}void print2(struct Book* pb){ /*printf("書(shū)名: %s/n", (*pb).name); printf("價(jià)格: %f/n", (*pb).price); printf("書(shū)號(hào): %s/n", (*pb).id);*/ printf("書(shū)名: %s/n", pb->name);//也可以這樣訪問(wèn) printf("價(jià)格: %f/n", pb->price); printf("書(shū)號(hào): %s/n", pb->id);}int main(){ struct Book b = {"C語(yǔ)言程序設(shè)計(jì)", 55.5f, "C20190201"}; print2(&b); //print1(b); //結(jié)構(gòu)成員訪問(wèn)操作符 //結(jié)構(gòu)變量.成員名 //結(jié)構(gòu)體指針->成員名 //(*結(jié)構(gòu)體指針).成員名 return 0;}
表達(dá)式求值的順序一部分是由操作符的優(yōu)先級(jí)和結(jié)合性決定。
同樣,有些表達(dá)式的操作數(shù)在求值的過(guò)程中可能需要轉(zhuǎn)換為其他類(lèi)型。
C語(yǔ)言的整型算術(shù)運(yùn)算總是至少以缺省整型類(lèi)型的精度來(lái)進(jìn)行的。
為了獲得這個(gè)精度,表達(dá)式中的字符和短整型操作數(shù)在使用之前被轉(zhuǎn)換為普通整型,這種轉(zhuǎn)換稱為整型提升。
整型提升的意義:
表達(dá)式的整型運(yùn)算要在 CPU 的相應(yīng)運(yùn)算器件內(nèi)執(zhí)行,CPU 內(nèi)整型運(yùn)算器 (ALU) 的操作數(shù)的字節(jié)長(zhǎng)度
一般就是 int 的字節(jié)長(zhǎng)度,同時(shí)也是 CPU 的通用寄存器的長(zhǎng)度。
因此,即使兩個(gè) char 類(lèi)型的相加,在 CPU 執(zhí)行時(shí)實(shí)際上也要先轉(zhuǎn)換為 CPU 內(nèi)整型操作數(shù)的標(biāo)準(zhǔn)長(zhǎng)
度。
通用 CPU(general-purpose CPU)是難以直接實(shí)現(xiàn)兩個(gè)8比特字節(jié)直接相加運(yùn)算(雖然機(jī)器指令
中可能有這種字節(jié)相加指令)。所以,表達(dá)式中各種長(zhǎng)度可能小于 int 長(zhǎng)度的整型值,都必須先轉(zhuǎn)
換為 int 或 unsigned int,然后才能送入 CPU 去執(zhí)行運(yùn)算。
如何進(jìn)行整體提升呢?
整形提升是按照變量的數(shù)據(jù)類(lèi)型的符號(hào)位來(lái)提升的
char c1 = -1;//變量c1的二進(jìn)制位(補(bǔ)碼)中只有8個(gè)比特位://1111111//因?yàn)?char 是有符號(hào)的 char//所以整形提升的時(shí)候,高位補(bǔ)充符號(hào)位,即為1//提升之后的結(jié)果是://11111111111111111111111111111111
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
//舉例:#include int main(){ char a = 3;//a是1byte - 8bit //00000000000000000000000000000011 //00000011 - a
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/119290.html
??蘇州程序大白一文從基礎(chǔ)手把手教你Python數(shù)據(jù)可視化大佬??《??記得收藏??》 目錄 ????開(kāi)講啦!!!!????蘇州程序大白?????博主介紹前言數(shù)據(jù)關(guān)系可視化散點(diǎn)圖 Scatter plots折線圖強(qiáng)調(diào)連續(xù)性 Emphasizing continuity with line plots同時(shí)顯示多了圖表 數(shù)據(jù)種類(lèi)的可視化 Plotting with categorical da...
目錄 一、什么是C語(yǔ)言? 二、第一個(gè)C語(yǔ)言程序 代碼 程序分析 ?程序運(yùn)行 一個(gè)工程中出現(xiàn)兩個(gè)及以上的main函數(shù) 代碼 運(yùn)行結(jié)果 分析 三、數(shù)據(jù)類(lèi)型 數(shù)據(jù)各種類(lèi)型 為什么會(huì)有這么多的數(shù)據(jù)類(lèi)型? 計(jì)算機(jī)單位 ?各個(gè)數(shù)據(jù)類(lèi)型的大小 ?注意事項(xiàng) 數(shù)據(jù)類(lèi)型的使用 四、變量和常量 變量的分類(lèi) 變量的使用 變量的作用域和生命周期 ?常量 五、字符串+轉(zhuǎn)義字符+注釋 字符串 ?轉(zhuǎn)義字符 注釋 六、選擇語(yǔ)句 ?...
??蘇州程序大白一文教你學(xué)會(huì)微信小程序開(kāi)發(fā)??《??記得收藏??》 目錄 ????開(kāi)講啦!!!!????蘇州程序大白?????博主介紹?前言?講講專享小程序有什么優(yōu)勢(shì)? ?小程序文件分析?事件綁定?圖片問(wèn)題?輪播圖swiper?自定義組件?生命周期?頁(yè)面生命周期?項(xiàng)目制作?緩沖事件?`es7 async`語(yǔ)法 ?觸底事件??下拉刷新頁(yè)面??css省略號(hào)??預(yù)覽大圖??購(gòu)物車(chē)模擬??獲取地...
閱讀 994·2023-04-25 15:42
閱讀 3584·2021-11-02 14:38
閱讀 2885·2021-09-30 09:48
閱讀 1419·2021-09-23 11:22
閱讀 3379·2021-09-06 15:02
閱讀 3185·2021-09-04 16:41
閱讀 606·2021-09-02 15:41
閱讀 2012·2021-08-26 14:13