1.算術操作符前言:
這一站與前面的時空間有一定的聯(lián)系,想了解更多內容請移步去看看
這里前面已經非常詳細地講解過了。如有不懂,請移步 |
補充:
1.數(shù)據(jù)在內存中是以補碼的形式存儲的,而表達輸出的結果是以原碼的形式進行表達的。即操作符都是對補碼進行操作的
2.正整數(shù)的原碼,反碼和補碼是一樣的
3.負整數(shù)的原碼,反碼,補碼之間的關系是:
(1)反碼=(除符號位外)按位取反
(2) 補碼=反碼+1
注意:
3.位操作符對于移位操作符,
- 不要進行負數(shù)移位,這個標準是未定義的
- 只能進行整數(shù)的操作,不能進行小數(shù)的操作
- &—按(二進制補碼)位與—有0就為0,兩個1才為1 (相當于邏輯操作符的&&)
- |—按(二進制補碼)位或—有1就為1,兩個0才為0 (相當于邏輯操作符的||)
- ^—按(二進制補碼)位異或—相同為0,相異為1
既然已經知道了原理,讓我們做幾道簡單的題來練練手:
想必大家都有自己的答案了,讓我們來看看正確答案與解題思路
下面,咱們上點難度:
實現(xiàn)不用額外的變量來實現(xiàn)兩個數(shù)的交換
這里前面已經非常詳細地講解過了。如有不懂,請移步 |
(2)sizeof與數(shù)組就前面的知識,在此補充:
- 有地址都可以進行取地址
- 在C語言中,變量,常量字符串,數(shù)組,結構體等在內存中都是有地址的,但字面常量(如 2)在內存中是沒有地址的
之前已經講過不少這方面的內容,今天就著重講一下sizeof 與數(shù)組
先看一下一下的代碼分別輸出什么:
運行結果:
解釋一下:
(3)前置和后置
在這里,我們來討論一下:先使用 后++,和先++后使用 的先后之分到底體現(xiàn)在哪里?
先后之分就體現(xiàn)在是否完成一個完整的語句
~—按(二進制補碼)位取反----符號位也取反
這里前面已經非常詳細地講解過了。如有不懂,請移步 |
在此,我們著重講解一下邏輯操作分符的控制求值順序
- &&----左邊為假,整體就為假–>右邊無需計算
- ||----左邊為真,整體就為真–>右邊無需計算
有的課本稱這種現(xiàn)象為短路
接下來,我們來一個例題練練手:
運行結果:
解釋一下原因(要認真看哦)
那這個咱就明白了,再來一個鞏固鞏固吧:
運行結果:
怎么樣,這個做對了吧。這個我也講一下原因
解釋一下原因(要認真看哦)
注意:
這里前面已經非常詳細地講解過了。如有不懂,請移步 |
- 逗號表達式,就是用逗號隔開的多個表達式
- 逗號表達式,從左向右依次執(zhí)行。整個表達式的結果是最后一個表達式的結果
下面,來看一下這個逗號操作符在現(xiàn)實生活中的妙用:
這里前面已經非常詳細地講解過了。如有不懂,請移步 |
(1)隱式類型轉換
- 表達式求值的順序一部分是由操作符的優(yōu)先級和結合性決定
- 同樣,有些表達式的操作數(shù)在求值的過程中可能需要轉換為其他類型
- C的整型算術運算總是至少以缺省整型類型的精度來進行的
- 為了獲得這個精度,表達式中的字符和短整型操作數(shù)在使用之前被轉換為普通整型,這種轉換稱為整型提升
表達式的整型運算要在CPU的相應運算器件內執(zhí)行,CPU內整型運算器(ALU)的操作數(shù)的字節(jié)長度
一般就是int的字節(jié)長度,同時也是CPU的通用寄存器的長度
因此,即使兩個char類型的相加,在CPU執(zhí)行時實際上也要先轉換為CPU內整型操作數(shù)的標準長度
通用CPU(general-purpose CPU)是難以直接實現(xiàn)兩個8比特字節(jié)直接相加運算(雖然機器指令中可能有這種字節(jié)相加指令)。所以,表達式中各種長度可能小于int長度的整型值,都必須先轉換為int或unsigned int,然后才能送入CPU去執(zhí)行運算
整形提升的規(guī)則:
我們來一點例題來鞏固一下:
例子1:
- a,b要進行整形提升,但是c不需要整形提升
- a,b整形提升之后,變成了負數(shù),所以表達式 a,b的結果是假,但是c不發(fā)生整形提升,則表達式 c==0xb6000000 的結果是真
例子2:
(2)算術轉換
- 整型提升這種場景大部分就是兩個不同類型之間進行加減乘除 或者比較之類的,場景不是特別多, 目前先了解這么多, 后邊遇到問題可以在具體分析
- 整形提升的前提是變量的類型是小于整形(int)的類型,在進行表達式運算(即運用操作符時),不足整形的變量要進行整形提升
(3)操作符的屬性如果某個操作符的各個操作數(shù)屬于不同的類型,那么除非其中一個操作數(shù)的轉換為另一個操作數(shù)的類型,否則操作就無法進行。下面的層次體系稱為尋常算術轉換
- 但是算術轉換要合理,要不然會有一些潛在的問題
下面我來舉例一個問題表達式,以此來證明優(yōu)先級和結合性都已確定,但先后順序還是不確定的
讓我來解釋一下吧:
總結:我們寫出的表達式如果不能通過操作符的屬性確定唯一的計算路徑,那這個表達式就是存在問題的。-------即我們寫代碼時不要吝嗇括號()
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧