前言:
幾乎每一個(gè)程序都需要進(jìn)行運(yùn)算,對(duì)數(shù)據(jù)進(jìn)行加工處理,否則程序就沒(méi)有意義了。要進(jìn)行運(yùn)算,就需規(guī)定可以使用的運(yùn)算符。C語(yǔ)言的運(yùn)算符范圍很寬,把除了控制語(yǔ)句和輸入輸出以外幾乎所有的基本操作都作為運(yùn)算符處理,例如將賦值符“=”作為賦值運(yùn)算符、方括號(hào)作為下標(biāo)運(yùn)算符等。
3.3.1 C運(yùn)算符
### 1. 算術(shù)運(yùn)算符
- **+** :加法
- **-** :減法
- **\*** :乘法
- **/** :除法
- **%** :求余數(shù)
### 2. 關(guān)系運(yùn)算符
- **==** :等于
- **!=** :不等于
- **<** :小于
- **>** :大于
- **<=** :小于或等于
- **>=** :大于或等于
### 3. 邏輯運(yùn)算符
- **&&** :邏輯與
- **||** :邏輯或
- **!** :邏輯非
### 4. 賦值運(yùn)算符
- **=** :賦值
- **+=** :加法賦值 (例如 x += 5 是 x = x + 5 的縮寫(xiě))
- **-=** :減法賦值
- **\*=** :乘法賦值
- **/=** :除法賦值
- **%=** :求余賦值
### 5. 位運(yùn)算符(這個(gè)知識(shí)點(diǎn)在Leetcode461.漢明距離中出現(xiàn))
傳送門(mén):漢明距離
- **&** :按位與
- **|** :按位或
- **^** :按位異或
- **~** :按位非
- **<<** :左移
- **>>** :右移
具體介紹:
位運(yùn)算符在C語(yǔ)言中用于對(duì)整數(shù)在位級(jí)別上進(jìn)行操作。這些運(yùn)算符主要針對(duì)整數(shù)的二進(jìn)制表示來(lái)工作,因此理解整數(shù)的二進(jìn)制表示方式對(duì)于理解位運(yùn)算是很有幫助的。
### 1. 位運(yùn)算符概覽
- **&** :按位與
- **|** :按位或
- **^** :按位異或
- **~** :按位非
- **<<** :左移
- **>>** :右移
### 2. 詳細(xì)講解與應(yīng)用
#### 2.1 **&** (按位與)
**用途**:只有當(dāng)兩個(gè)對(duì)應(yīng)的位都為1時(shí),結(jié)果才為1。
**實(shí)例**:
```c
int a = 5; ? ?// 0101 (二進(jìn)制)
int b = 3; ? ?// 0011 (二進(jìn)制)
int result = a & b; ?// 結(jié)果為 1 ,即 0001 (二進(jìn)制)
```
#### 2.2 **|** (按位或)
**用途**:只要兩個(gè)對(duì)應(yīng)的位之一為1,結(jié)果就為1。
**實(shí)例**:
```c
int result = a | b; ?// 結(jié)果為 7,即 0111 (二進(jìn)制)
```
#### 2.3 **^** (按位異或)
**用途**:當(dāng)兩個(gè)對(duì)應(yīng)的位不相同時(shí),結(jié)果為1。
**實(shí)例**:
```c
int result = a ^ b; ?// 結(jié)果為 6,即 0110 (二進(jìn)制)
```
#### 2.4 **~** (按位非)
**用途**:反轉(zhuǎn)所有位。
**實(shí)例**:
```c
int result = ~a; ?// 結(jié)果是 -6。原因是現(xiàn)代計(jì)算機(jī)使用補(bǔ)碼表示負(fù)數(shù),所以這是補(bǔ)碼表示的 -6。
```
#### 2.5 **<<** (左移)
**用途**:將數(shù)值的所有位向左移動(dòng)指定的位數(shù)。
**實(shí)例**:
```c
int result = a << 1; ?// 結(jié)果為 10。因?yàn)?5 (即 0101) 向左移動(dòng)一位變?yōu)?1010,即十進(jìn)制的10。
```
#### 2.6 **>>** (右移)
**用途**:將數(shù)值的所有位向右移動(dòng)指定的位數(shù)。
**實(shí)例**:
```c
int result = a >> 1; ?// 結(jié)果為 2。因?yàn)?5 (即 0101) 向右移動(dòng)一位變?yōu)?0010,即十進(jìn)制的2。
```
### 3. 位運(yùn)算的實(shí)踐應(yīng)用:
1. **快速判斷奇偶**:`if (x & 1) { /* 奇數(shù) */ } else { /* 偶數(shù) */ }`
2. **交換兩個(gè)數(shù)**:`a = a ^ b; b = a ^ b; a = a ^ b;` (不需要額外的存儲(chǔ)空間)
3. **檢查特定位是否設(shè)置**:`if (x & (1 << n)) { /* 第n位被設(shè)置了 */ }`
4. **設(shè)置特定位**:`x |= (1 << n);`
5. **清除特定位**:`x &= ~(1 << n);`
6. **翻轉(zhuǎn)特定位**:`x ^= (1 << n);`
了解位運(yùn)算的內(nèi)部機(jī)制和它們的實(shí)際應(yīng)用可以幫助開(kāi)發(fā)者編寫(xiě)更高效的代碼,特別是在資源有限或性能要求較高的環(huán)境中。
### 6. 其他運(yùn)算符
- **sizeof()** :返回?cái)?shù)據(jù)類(lèi)型或變量的大?。ㄒ宰止?jié)為單位)。
- **& (取地址運(yùn)算符)** :獲取變量的地址。
- **\* (指針運(yùn)算符)** :指針變量所指向的值。
- **? : (三目運(yùn)算符)** :條件運(yùn)算符,也稱(chēng)為三元運(yùn)算符。
每類(lèi)運(yùn)算符都有其特定的使用場(chǎng)景和優(yōu)先級(jí)。理解它們的作用和如何正確地在代碼中使用它們是掌握C語(yǔ)言的關(guān)鍵。
3.3.2 基本的算術(shù)運(yùn)算符
3.3.3 自增自減運(yùn)算符(這個(gè)知識(shí)點(diǎn)在Leetcode兩數(shù)相除中出現(xiàn))
1.第一個(gè)我的不足暴露的地方在這里:(傳送門(mén):)這里在Leetcode中的兩數(shù)相除問(wèn)題中概念模糊不知道是直接寫(xiě)成sign++還是sign=sign++。
我的理解:
### 3.3.3 自增(++)、自減(--)運(yùn)算符
自增 (`++`) 和自減 (`--`) 運(yùn)算符在編程中非常常見(jiàn),它們用于簡(jiǎn)化對(duì)變量加1或減1的操作。
- **前綴模式**(`++i` 或 `--i`):在其他操作發(fā)生前,變量值先進(jìn)行加1或減1。
- **后綴模式**(`i++` 或 `i--`):其他操作發(fā)生后,變量值才進(jìn)行加1或減1。
例如:
1. `j=++i;`:先增加i的值,然后將i的新值賦給j。
2. `j=i++;`:先將i的當(dāng)前值賦給j,然后再增加i的值。
但請(qǐng)注意,過(guò)多地在復(fù)雜的表達(dá)式中使用這些運(yùn)算符會(huì)降低代碼的可讀性。為了編寫(xiě)清晰、易于維護(hù)的代碼,最好僅在簡(jiǎn)單的情境下使用自增和自減運(yùn)算符,并避免在同一語(yǔ)句中混合多種操作。
3.3.4 算術(shù)表達(dá)式和運(yùn)算符的優(yōu)先性與結(jié)合性
我的理解:
### 3.3.4 算術(shù)表達(dá)式和運(yùn)算符的優(yōu)先級(jí)與結(jié)合性
在C語(yǔ)言中,表達(dá)式由操作數(shù)和運(yùn)算符組成,而每個(gè)運(yùn)算符都有相應(yīng)的優(yōu)先級(jí)和結(jié)合性。
- **優(yōu)先級(jí)**:定義了在沒(méi)有明確的括號(hào)時(shí),哪些運(yùn)算符首先被求值。例如,乘法和除法的優(yōu)先級(jí)高于加法和減法,所以在 `a-b*c` 中,先執(zhí)行乘法操作。
??
- **結(jié)合性**:當(dāng)兩個(gè)運(yùn)算符優(yōu)先級(jí)相同時(shí),結(jié)合性決定了哪個(gè)運(yùn)算符首先被評(píng)估。大多數(shù)算術(shù)運(yùn)算符從左到右進(jìn)行評(píng)估,即它們具有左結(jié)合性。
使用正確的優(yōu)先級(jí)和結(jié)合性規(guī)則是很重要的,因?yàn)樗鼈兛梢杂绊懙奖磉_(dá)式的結(jié)果。為了避免混淆和潛在的錯(cuò)誤,最佳的做法是在可能存在歧義的地方使用括號(hào)來(lái)明確你的意圖。
這兩個(gè)部分的核心是理解自增和自減運(yùn)算符如何工作,以及如何根據(jù)運(yùn)算符的優(yōu)先級(jí)和結(jié)合性來(lái)正確地評(píng)估復(fù)雜的表達(dá)式。
好的,我會(huì)為你解釋這段話(huà)并強(qiáng)調(diào)其核心概念。
首先,當(dāng)我們討論表達(dá)式的**結(jié)合性**時(shí),我們是在討論當(dāng)有多個(gè)相同優(yōu)先級(jí)的運(yùn)算符出現(xiàn)在表達(dá)式中時(shí),該如何執(zhí)行它們。
### **左結(jié)合性 (自左至右)**
大部分的運(yùn)算符在C語(yǔ)言中是具有左結(jié)合性的。這意味著當(dāng)你有一個(gè)像 `a - b + c` 這樣的表達(dá)式時(shí),由于減法和加法有相同的優(yōu)先級(jí),根據(jù)左結(jié)合性原則,你首先計(jì)算 `a - b`,然后再加上 `c`。所以表達(dá)式實(shí)際上是 `(a - b) + c`。
### **右結(jié)合性 (自右至左)**
賦值運(yùn)算符和某些其他的運(yùn)算符在C中是具有右結(jié)合性的??紤]一個(gè)表達(dá)式 `a = b = c`,根據(jù)右結(jié)合性原則,你首先為 `b` 賦值 `c`,然后再為 `a` 賦值 `b` 的結(jié)果(也就是 `c` 的值)。因此,這個(gè)表達(dá)式實(shí)際上被解釋為 `a = (b = c)`。
### **結(jié)合性在C語(yǔ)言中的特性**
雖然大多數(shù)編程語(yǔ)言都定義了運(yùn)算符的優(yōu)先級(jí),但并非所有的編程語(yǔ)言都明確地定義了運(yùn)算符的結(jié)合性。在C語(yǔ)言中,結(jié)合性是明確定義的,這是它與某些其他語(yǔ)言的一個(gè)區(qū)別。
### **實(shí)踐建議**
對(duì)于日常編程來(lái)說(shuō),記住算術(shù)運(yùn)算符具有左結(jié)合性,而賦值運(yùn)算符具有右結(jié)合性是很有用的。但是,為了避免誤解和編程錯(cuò)誤,最佳實(shí)踐是在不確定或可能引起混淆的情況下使用括號(hào)來(lái)明確你的意圖。
這樣做不僅可以確保正確性,還可以提高代碼的可讀性,使其他開(kāi)發(fā)者更容易理解你的代碼。
3.3.5 不同數(shù)據(jù)間的混合運(yùn)算
我的理解:
這段內(nèi)容解釋了在C語(yǔ)言中進(jìn)行不同數(shù)據(jù)類(lèi)型的混合運(yùn)算時(shí)如何進(jìn)行自動(dòng)類(lèi)型轉(zhuǎn)換,并通過(guò)一個(gè)例子詳細(xì)說(shuō)明了這一點(diǎn)。
### **混合運(yùn)算及其規(guī)律**
1. **不同數(shù)據(jù)類(lèi)型的混合運(yùn)算**: 當(dāng)涉及到不同類(lèi)型的數(shù)據(jù)進(jìn)行運(yùn)算時(shí)(如 `int` 和 `double`),C語(yǔ)言會(huì)自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換,使二者成為同一種類(lèi)型后再進(jìn)行運(yùn)算。
2. **轉(zhuǎn)換規(guī)律**:
? ?- 當(dāng)運(yùn)算涉及 `float` 或 `double` 時(shí),結(jié)果是 `double` 類(lèi)型。
? ?- 當(dāng) `int` 與 `float` 或 `double` 進(jìn)行運(yùn)算時(shí),所有參與的數(shù)據(jù)都將轉(zhuǎn)換為 `double` 類(lèi)型,并返回 `double` 類(lèi)型的結(jié)果。
? ?- 當(dāng)字符型 (`char`) 數(shù)據(jù)與整數(shù)型進(jìn)行運(yùn)算時(shí),實(shí)際上是字符的ASCII值與整數(shù)進(jìn)行的運(yùn)算。例如, `12 + 'A'` 是 `12 + 65 = 77`。如果字符型數(shù)據(jù)與實(shí)型數(shù)據(jù)進(jìn)行運(yùn)算,則將字符的ASCII值轉(zhuǎn)換為 `double` 類(lèi)型后再進(jìn)行運(yùn)算。
### **混合運(yùn)算的例子**
對(duì)于給定的表達(dá)式 `10+'a'+i*f-d/3`:
- `'a'` 轉(zhuǎn)為 ASCII 值,為 97。
- 因?yàn)槌朔▋?yōu)先級(jí)高于加法,先進(jìn)行 `i*f` 運(yùn)算。i和f都轉(zhuǎn)為 `double` 類(lèi)型后進(jìn)行運(yùn)算,結(jié)果為 `7.5`。
- 整數(shù)107 (`10 + 97`) 與 `i*f` 的結(jié)果 `7.5` 相加,得到 `114.5`。
- `d/3` 的結(jié)果為 `2.5`。
- `114.5 - 2.5` 的結(jié)果為 `112.0`。
### **例子【例3.3】**
這個(gè)例子解決了如何將大寫(xiě)字母轉(zhuǎn)換為小寫(xiě)字母。字符在內(nèi)存中以ASCII碼形式存儲(chǔ),因此可以通過(guò)算術(shù)運(yùn)算進(jìn)行字符轉(zhuǎn)換。
要轉(zhuǎn)換大小寫(xiě)字母,需要了解大寫(xiě)和小寫(xiě)之間的關(guān)系:小寫(xiě)字母的ASCII值比對(duì)應(yīng)的大寫(xiě)字母的值大32。例如,`'a'` 的 ASCII 值是 97,而 `'A'` 的值是 65。
利用這一特性,可以通過(guò)為大寫(xiě)字母加32得到對(duì)應(yīng)的小寫(xiě)字母。
這些信息對(duì)于理解C語(yǔ)言中的數(shù)據(jù)類(lèi)型轉(zhuǎn)換和混合運(yùn)算非常重要,并強(qiáng)調(diào)了編程時(shí)要注意的細(xì)節(jié)。
3.3.6 強(qiáng)制運(yùn)行轉(zhuǎn)換運(yùn)算符
我的理解:
好的,這段話(huà)講述的是C語(yǔ)言中關(guān)于類(lèi)型轉(zhuǎn)換的概念,尤其是“強(qiáng)制類(lèi)型轉(zhuǎn)換”。
**強(qiáng)制類(lèi)型轉(zhuǎn)換**:在編程時(shí),有時(shí)我們需要將一個(gè)數(shù)據(jù)類(lèi)型的變量或表達(dá)式轉(zhuǎn)換為另一個(gè)數(shù)據(jù)類(lèi)型,這種手動(dòng)進(jìn)行的類(lèi)型轉(zhuǎn)換被稱(chēng)為“強(qiáng)制類(lèi)型轉(zhuǎn)換”。
**如何進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換**:要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換,你需要在要轉(zhuǎn)換的變量或表達(dá)式前加上`(目標(biāo)數(shù)據(jù)類(lèi)型)`。例如,`(double)a`將變量a轉(zhuǎn)換為double類(lèi)型。
**注意事項(xiàng)**: ?
1. 當(dāng)你使用強(qiáng)制類(lèi)型轉(zhuǎn)換時(shí),實(shí)際上是生成了一個(gè)新的、所需類(lèi)型的中間值。原始變量的數(shù)據(jù)類(lèi)型和值都不會(huì)發(fā)生變化。 ?
2. 你必須確保在強(qiáng)制類(lèi)型轉(zhuǎn)換時(shí)使用括號(hào)正確地包圍整個(gè)表達(dá)式。例如,如果你寫(xiě)`(int)x + y`,那么只有x會(huì)被轉(zhuǎn)換為int,然后再加上y。但如果你寫(xiě)`(int)(x + y)`,則x和y的和會(huì)被轉(zhuǎn)換為int。
**自動(dòng)類(lèi)型轉(zhuǎn)換 vs 強(qiáng)制類(lèi)型轉(zhuǎn)換**: ?
1. **自動(dòng)類(lèi)型轉(zhuǎn)換**:有時(shí),當(dāng)兩個(gè)不同類(lèi)型的數(shù)據(jù)參與運(yùn)算時(shí),編譯器會(huì)自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換。例如,在`3 + 6.5`中,整數(shù)3會(huì)自動(dòng)轉(zhuǎn)換為浮點(diǎn)數(shù),然后與6.5相加,結(jié)果為浮點(diǎn)數(shù)。
2. **強(qiáng)制類(lèi)型轉(zhuǎn)換**:當(dāng)自動(dòng)類(lèi)型轉(zhuǎn)換不能滿(mǎn)足我們的需求時(shí),我們需要手動(dòng)進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換。例如,`%`運(yùn)算符需要兩邊都是整數(shù),如果x是浮點(diǎn)數(shù),那么`x % 3`是非法的,你必須使用`(int)x % 3`。
在函數(shù)調(diào)用時(shí),為了使實(shí)參與形參的類(lèi)型一致,有時(shí)我們也會(huì)使用強(qiáng)制類(lèi)型轉(zhuǎn)換。例如,如果函數(shù)期望一個(gè)int類(lèi)型的參數(shù),但你有一個(gè)double變量,你可以通過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換將它轉(zhuǎn)換為int然后傳遞。
總的來(lái)說(shuō),強(qiáng)制類(lèi)型轉(zhuǎn)換是C語(yǔ)言中一個(gè)非常有用的工具,它允許開(kāi)發(fā)者明確地指定數(shù)據(jù)應(yīng)該如何被處理,而不是依賴(lài)于編譯器的自動(dòng)類(lèi)型轉(zhuǎn)換。但也要注意使用它的正確方法,并了解它的限制和潛在風(fēng)險(xiǎn)。
總結(jié):
**3.3 運(yùn)算符和表達(dá)式**的重點(diǎn)、難點(diǎn)和易錯(cuò)點(diǎn)如下:
**重點(diǎn)**:
1. **運(yùn)算符的種類(lèi)與功能**:理解各種運(yùn)算符(如算術(shù)、關(guān)系、邏輯、賦值、條件、位等)的功能和使用方法。
2. **運(yùn)算符的優(yōu)先級(jí)和結(jié)合性**:理解哪些運(yùn)算符優(yōu)先于其他運(yùn)算符進(jìn)行計(jì)算,并知道運(yùn)算是從左到右還是從右到左。
3. **數(shù)據(jù)類(lèi)型的自動(dòng)與強(qiáng)制轉(zhuǎn)換**:知道在哪些情況下編譯器會(huì)自動(dòng)轉(zhuǎn)換數(shù)據(jù)類(lèi)型,以及如何手動(dòng)進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換。
**難點(diǎn)**:
1. **復(fù)合表達(dá)式的求值**:當(dāng)一個(gè)表達(dá)式包含多個(gè)運(yùn)算符和操作數(shù)時(shí),理解其求值的過(guò)程可能會(huì)有些困難,特別是當(dāng)它們的優(yōu)先級(jí)和結(jié)合性相互影響時(shí)。
2. **強(qiáng)制類(lèi)型轉(zhuǎn)換的應(yīng)用**:知道何時(shí)和如何正確地應(yīng)用強(qiáng)制類(lèi)型轉(zhuǎn)換,以避免不期望的結(jié)果。
3. **字符型與整型之間的運(yùn)算**:例如,使用字符的ASCII值進(jìn)行運(yùn)算可能會(huì)令初學(xué)者感到困惑。
**易錯(cuò)點(diǎn)**:
1. **優(yōu)先級(jí)和結(jié)合性的誤解**:不正確地認(rèn)為某個(gè)運(yùn)算符比另一個(gè)優(yōu)先,或誤解其結(jié)合方向,從而得到錯(cuò)誤的結(jié)果。
2. **不正確的類(lèi)型轉(zhuǎn)換**:不明確數(shù)據(jù)類(lèi)型的自動(dòng)轉(zhuǎn)換規(guī)則,或者在需要的情況下沒(méi)有應(yīng)用強(qiáng)制類(lèi)型轉(zhuǎn)換。
3. **忽略整型溢出**:當(dāng)整數(shù)運(yùn)算的結(jié)果超出其數(shù)據(jù)類(lèi)型能表示的范圍時(shí),可能會(huì)導(dǎo)致溢出,而這通常不會(huì)引發(fā)錯(cuò)誤,但會(huì)導(dǎo)致不正確的結(jié)果。
4. **字符與整數(shù)的混淆**:例如,將數(shù)字字符(如'3')與實(shí)際的整數(shù)(如3)混淆。
5. **強(qiáng)制轉(zhuǎn)換的格式錯(cuò)誤**:如在進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換時(shí)忘記使用括號(hào)。
總之,理解運(yùn)算符和表達(dá)式是學(xué)習(xí)C語(yǔ)言的基礎(chǔ)部分。要確保深入理解每個(gè)概念,并多做練習(xí),以便掌握各種情況下的正確應(yīng)用方法。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-677627.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-677627.html
到了這里,關(guān)于3.3 運(yùn)算符和表達(dá)式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!