c++ 位运算_C语言之运算符
運算符代表的是各種各樣的運算(操作)
已知的運算符:+ - * / =(賦值)
1.運算符的分類
運算符的分類方法很多,通常用功能或者操作數個數進行分類
功能:算數運算符 邏輯運算符 位運算符 地址運算符.......
操作數個數:單目運算符 雙目運算符 三目運算符
(1)算數運算符
+ - * / %(取余)
自增運算符(++)和自減運算符(--)的作用是對變量進行加一和減一的操作
他們都是單目運算符,只需要一個操作數
他們的使用方法有兩種:前操作和后操作
前操作: ++變量名; --變量名; 后操作: 變量名++; 變量名--;前操作的優先級非常高,通常在一條語句中最先執行
后操作的優先級非常低,通常在一條語句中最后執行
注意:
不要在一個表達式中多次使用自增和自減運算符,容易造成歧義
(2)關系和邏輯運算符
關系和邏輯運算符的計算結果是一個布爾值(真or假),使用關系和邏輯運算符就可以構成邏輯表達式。
關系運算符的優先級低于算數運算符
雙目的關系運算符包括 == > < >= <= !=
表達式成立,結果就為1,不成立,結果就為0
邏輯運算符可以構成復雜的邏輯表達式,邏輯運算符的優先級比關系運算符要低
邏輯運算符包括 !(取反) &&(與) ||(或)
!是一個單目的邏輯運算符,作用是將一個布爾值(邏輯表達式)取反
與(&&)和或(||)屬于雙目運算符,他們的作用就是構造復雜的邏輯表達式
與和或的運算規則:
邏輯與,邏輯或運算規則
記憶口訣:與運算----全1為1,其他為0
或運算----全0為0,其他為1
短路特性:
與運算和或運算具有短路的特性,如果前一個表達式的已經可以決定整個表達式的結果,此時不會去計算后一個表達式。
(3)位運算符
位運算就是對操作數進行對應的位之間的運算
以下運算都屬于位運算:
& ----------- 按位與
| ------------ 按位或
^ ----------- 按位異或
~ ----------- 按位取反(單目)
<< --------- 按位左移
>> --------- 按位右移
1)按位與 ---- &
按位與將操作數對應的位進行與運算
3 & 5 = 0011 & 0101 = 0001 = 1按位與可以將一個數字的某些二進制位清0
任何數與上0結果為0,任何數與上1結果不變
xxxx xxxx & 1111 0111 = xxxx 0xxx
2)按位或 ---- |
按位或將操作數對應的位進行或運算
3 | 5 = 0011 | 0101 = 0111 = 7按位與可以將一個數字的某些二進制位置一
任何數或上0結果不變,任何數或上1結果位1
xxxx xxxx | 0000 1000 = xxxx 1xxx
3)按位異或 ----- ^
按位異或就是對應位進行異或運算
異或運算的運算方法是 相同為0,不同為1
異或運算規則
3 ^ 5 = 0011^0101 = 0110 = 6按位異或可以將一個數字的某些二進制位取反
任何一個數異或上1取反,任何一個數異或上0不變
xxxx xxxx ^ 0000 1000 = xxxx yxxx(y是x取反)
口訣:與0清0,或1置1,異或1取反
4)按位取反 ------ ~
作用是將某個數的二進制位全部取反
~0xaf = 0x50 1010 1111 -------> 0101 00005)按位左移 ------ << 按位右移 --------- >>
移位操作將數字的所有二進制位當成一個整體水平左右移動
移位運算符屬于雙目運算符,左邊是要移位的數據,右邊就是要移位的位數
移位會導致移位數字的某些數位丟失,也會空出一些位置
移位的操作方法:
左移移出的高位丟棄,空出的低位補0 ------- 邏輯左移
無符號數據右移移出的低位丟棄,空出的高位補0 -------- 邏輯右移
有符號數據右移移出的低位丟棄,空出的高位補符號位 ------- 算數右移
移位操作演示
如果移位操作中沒有丟失有效數據(移出的位中沒有1),左移n位就相當于將數字乘以2的n次方,右移n位就相當于將數字除以2的n次方
(4)使用位運算構造一個任意的二進制數
有一個數字1111 1111,需要將第3-4位清0 --------> 1110 0111
unsigned char ch = 255; //使用按位與對某些位清0 ch & ~(0x3<<3) = 1110 0111 = 0xe7有一個數字0000 0000,需要將第3-4位置1 --------> 0001 1000
unsigned char ch = 0; //使用按位與對某些位清0 ch | (0x3<<3) = 0001 1000 = 0x18有一個數字1111 0000,需要將第3-4位取反 -------->1110 1000
unsigned char ch = 240; //使用按位與對某些位清0 ch ^ (0x3<<3) = 1110 1000 = 0xe8思考:使用位運算,構造出一個0xaf的字符類型的值
先清0后置1
(4)復合賦值運算符
大多數的雙目運算符,可以和賦值運算符組合形成新的復合賦值運算符
+= -= *= /= %= &= |= ^= >>== <<==
當希望把運算結果保存到某個參與運算的操作數時可以使用復合賦值運算符
a = a+b ---------> a += b a = a< a <<= b復合賦值運算符的優先級和賦值運算符一樣低。
(5)地址相關運算符
&是取地址運算符(單目),可以根據變量名獲取變量的地址
int num; &num ----->變量的地址C語言中使用%p占位符打印地址
*運算符(單目)可以根據地址獲取該地址上的數據
(6)逗號運算符
逗號運算符作用用于合并兩個表達式,運算時取后一個表達式的結果
逗號運算符的優先級低于賦值運算符
應用場景:
1.連接表達式 2.聲明多個同類型變量 3.for循環中作為分隔符(7)三目運算符
三目(條件)運算符的作用是根據某個表達式的結果來選擇執行的內容
格式:
表達式 ? 公式1 : 公式2如果表達式為真,執行公式1,否則執行公式2
練習:使用三目運算符,將用戶輸入的大寫字母變為小寫字母,輸入的小寫字母變成大寫字母。
2.類型轉換
(1)自動類型轉換
如果一個表達式中包含多種類型的數據,C語言會將這些數據轉換成同一種數據類型后再進行處理。
這個轉換過程由計算機自動完成,所以叫自動類型轉換(隱式類型轉換)
轉換規則:
1)如果不同數據類型所占空間不同,就會把占用空間小的類型轉換成占用空間大的類型
2)如果不同數據類型所占空間相同,就把整數類型轉換成浮點類型
3)如果不同數據類型所占空間相同,就把有符號轉換成無符號
注意:在實際開發中不要使用自動類型轉換,保證一個表達式中的數據類型相同
(2)強制類型轉換
可以在C語言中任意給數據指定類型,這種方式就叫強制類型轉換
語法:
(指定的類型)原數據強制類型轉換幾乎不受任何規則約束,有可能造成數據丟失
強制類型轉換的實現是計算機臨時生成一個新的數據,并不會改變原有數據
新數據的值來自于原數據,類型由強轉類型指定
3.運算符的優先級和結合性
優先級:當在一個表達式中出現多個不同優先級的運算符時,由優先級決定先運算還是后運算,優先級高的先運算,數字越小,優先級越高。
結合性:當在一個表達式中出現了相同優先級的運算符,就要按照結合性的順序來進行運算,結合性分為左結合(從左到右)和右結合(從右到左)
num + num_1 + num_2 ------>從左到右 num = num_1 = num_2 ------>從右到左運算符優先級和結合性表格
運算符優先級和結合性表格(一)
運算符優先級和結合性表格(二)
4.C語言表達式的求值順序
int num = 1;int num_1 = num++ + num;(1)順序點
C語言所有的運算都在表達式中完成,表達式本身完成以下兩個內容
1)得到一個運算結果
2)產生副作用,所謂副作用就是會對表達式中的變量的值進行修改
++ -- =.....i++ ------->運算結果是i的值,副作用是將i+1 ++i ------->運算結果是i+1,副作用是將i+1順序點表示的是副作用必須產生效果的最后時間,副作用產生效果一定在順序點之前。
..... i++.... 順序點 .....以num++ + num為例討論順序點對表達式求值的影響
如果在運算加法的時候副作用已經生效,那么表達式的運算結果為 2*num+1
如果在運算加法的時候副作用尚未生效,那么表達式的運算結果為 2*num
(2)C語言中規定的順序點的位置
1)完整表達式結束
表達式語句結束
return語句
分支(if switch)和循環(for while)條件中
2)函數調用語句中,在是實參賦值完成和函數第一條語句執行之前
3)運算符 && || 逗號和? :的一個操作數獲取之后
num++ + num在C語言中的運算結果是多少,答案是不確定(3)C語言為什么不規定更多的順序點來保證表達式確定的執行順序
C/C++不規定很多的順序點,求值順序可能不確定,Java嚴格規定了求值順序(從左到右)。C/C++這種做法是有意的,在編譯器設計和優化的時候就可以根據實際需求去調整求值順序,得到更高執行效率的代碼。java規定了確定的求值順序,在喪失了一定的效率獲得了更加清晰地程序行為。一門編程語言是否規定求值順序是由其各自設計原則來決定的。
結論:
在C/C++中,任何依賴于特定執行順序,依賴順序點之間實現副作用的表達式,其結果將得不到保證。
配套視頻:深度解析C語言
總結
以上是生活随笔為你收集整理的c++ 位运算_C语言之运算符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美图秀秀+美图贴贴打造多风格头像 增粉利
- 下一篇: c++ 多核cpu序列号_关于 CPU