<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
+ - * / %
+,-和*運算元我就不多說了,這裡我們重點來 / 和%
/運算元
作用:就是求商
注意點:
1 二邊的運算元都是整形,商的結果就為整數
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倍
注意:
對於移位運運算元,不要移動負數位,這個是標準未定義的。
& //按位元與
| //按位元或
^ //按位元互斥或
注:他們的運算元必須是整數。
我們這些位元運算符都是針對運算元的二補數進行操作的
&操作符
作用:對於二進位制數,都為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來實現。
=
這個操作符是用來賦值的,我們要於‘==’區分,這個是用來表示相等的,大家是否在程式設計的時候會弄錯呢?下面教大家一種寫法可以在很大程度上避免這種錯誤。
#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;
! 邏輯反操作
- 負值
+ 正值
& 取地址
sizeof 運算元的型別長度(以位元組為單位)
~ 對一個數的二進位制按位元取反
-- 前置、後置--
++ 前置、後置++
* 間接存取操作符(解除參照操作符)
(型別) 強制型別轉換
單目操作符的操作對像是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; }
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個位元組。
>
>=
< <=
!= 用於測試“不相等”
== 用於測試“相等”
&& 邏輯與
|| 邏輯或
用一道例題來說明邏輯操作符
#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進行了前置++或者後置++的操作嗎?
這是因為對於&&來說只要他的左表示式為假了,後面就不在執行。
而對於||來說只要左表示式為真,後面就不在執行了
xp1 ? exp2 : exp3
這個意思就是如果xp1為真,就執行exp2,否則就執行exp3。
exp1, exp2, exp3,.......expN
逗號表示式,就是用逗號隔開的多個表示式。
逗號表示式,從左向右依次執行。整個表示式的結果是最後一個表示式的結果。
運算元:一個陣列名 + 一個索引值
對於一個已經初始化的陣列來說,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; }
接受一個或者多個運算元:第一個運算元是函數名,剩餘的運算元就是傳遞給函數的引數。
. 結構體.成員名
-> 結構體指標->成員名
對於一給表示式我們一般要考慮它的計算操作符的優先順序和結合性,當表示式進行求值的時候還可能會發生整形提升。
什麼是整形提升呢?就是在計算的計算的過程中都是預設以整形的方式進行計算的,當我是char型別參與計算時候就要發生整形提升。
整形提升規則:
負數的整形提升
char c1 = -1;
變數c1的二進位制位(二補數)中只有8個位元位:
1111111
因為 char 為有符號的 char
所以整形提升的時候,高位補充符號位,即為1
提升之後的結果是: 11111111111111111111111111111111
正數的整形提升
char c2 = 1;
變數c2的二進位制位(二補數)中只有8個位元位:
00000001
因為 char 為有符號的 char 所以整形提升的時候,高位補充符號位,即為0
提升之後的結果是: 00000000000000000000000000000001
無符號整形提升,高位補0
對於應該複雜表示式的求值有三個影響的因素。
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!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45