運(yùn)算符基本概念
-
和數(shù)學(xué)中的運(yùn)算符一樣, C語言中的運(yùn)算符是告訴程序執(zhí)行特定算術(shù)或邏輯操作的符號(hào)
-
例如告訴程序, 某兩個(gè)數(shù)相加, 相減,相乘等
-
-
什么是表達(dá)式
- 表達(dá)式就是利用運(yùn)算符鏈接在一起的有意義,有結(jié)果的語句;
- 例如: a + b; 就是一個(gè)算數(shù)表達(dá)式, 它的意義是將兩個(gè)數(shù)相加, 兩個(gè)數(shù)相加的結(jié)果就是表達(dá)式的結(jié)果
- 注意: 表達(dá)式一定要有結(jié)果
運(yùn)算符分類
- 按照功能劃分:
- 算術(shù)運(yùn)算符
- 賦值運(yùn)算符
- 關(guān)系運(yùn)算符
- 邏輯運(yùn)算符
- 位運(yùn)算符
- 按照參與運(yùn)算的操作數(shù)個(gè)數(shù)劃分:
- 單目運(yùn)算
- 只有一個(gè)操作數(shù) 如 : i++;
- 雙目運(yùn)算
- 有兩個(gè)操作數(shù) 如 : a + b;
- 三目運(yùn)算
- C語言中唯一的一個(gè),也稱為問號(hào)表達(dá)式 如: a>b ? 1 : 0;
- 單目運(yùn)算
運(yùn)算符的優(yōu)先級和結(jié)合性
- 早在小學(xué)的數(shù)學(xué)課本中,我們就學(xué)習(xí)過"從左往右,先乘除后加減,有括號(hào)的先算括號(hào)里面的", 這句話就蘊(yùn)含了優(yōu)先級和結(jié)合性的問題
- C語言中,運(yùn)算符的運(yùn)算優(yōu)先級共分為15 級。1 級最高,15 級最低
- 在C語言表達(dá)式中,不同優(yōu)先級的運(yùn)算符, 運(yùn)算次序按照由高到低執(zhí)行
- 在C語言表達(dá)式中,相同優(yōu)先級的運(yùn)算符, 運(yùn)算次序按照結(jié)合性規(guī)定的方向執(zhí)行
算數(shù)運(yùn)算符
| 優(yōu)先級 | 名稱 | 符號(hào) | 說明 |
|---|---|---|---|
| 3 | 乘法運(yùn)算符 | * | 雙目運(yùn)算符,具有左結(jié)合性 |
| 3 | 除法運(yùn)算符 | / | 雙目運(yùn)算符,具有左結(jié)合性 |
| 3 | 求余運(yùn)算符 (模運(yùn)算符) | % | 雙目運(yùn)算符,具有左結(jié)合性 |
| 4 | 加法運(yùn)算符 | + | 雙目運(yùn)算符,具有左結(jié)合性 |
| 4 | 減法運(yùn)算符 | - | 雙目運(yùn)算符,具有左結(jié)合性 |
- 注意事項(xiàng)
- 如果參與運(yùn)算的兩個(gè)操作數(shù)皆為整數(shù), 那么結(jié)果也為整數(shù)
- 如果參與運(yùn)算的兩個(gè)操作數(shù)其中一個(gè)是浮點(diǎn)數(shù), 那么結(jié)果一定是浮點(diǎn)數(shù)
- 求余運(yùn)算符, 本質(zhì)上就是數(shù)學(xué)的商和余"中的余數(shù)
- 求余運(yùn)算符, 參與運(yùn)算的兩個(gè)操作數(shù)必須都是整數(shù), 不能包含浮點(diǎn)數(shù)
- 求余運(yùn)算符, 被除數(shù)小于除數(shù), 那么結(jié)果就是被除數(shù)
- 求余運(yùn)算符, 運(yùn)算結(jié)果的正負(fù)性取決于被除數(shù),跟除數(shù)無關(guān), 被除數(shù)是正數(shù)結(jié)果就是正數(shù),被除數(shù)是負(fù)數(shù)結(jié)果就是負(fù)數(shù)
- 求余運(yùn)算符, 被除數(shù)為0, 結(jié)果為0
- 求余運(yùn)算符, 除數(shù)為0, 沒有意義(不要這樣寫)
#include <stdio.h>
int main(){
int a = 10;
int b = 5;
// 加法
int result = a + b;
printf("%i\n", result); // 15
// 減法
result = a - b;
printf("%i\n", result); // 5
// 乘法
result = a * b;
printf("%i\n", result); // 50
// 除法
result = a / b;
printf("%i\n", result); // 2
// 算術(shù)運(yùn)算符的結(jié)合性和優(yōu)先級
// 結(jié)合性: 左結(jié)合性, 從左至右
int c = 50;
result = a + b + c; // 15 + c; 65;
printf("%i\n", result);
// 優(yōu)先級: * / % 大于 + -
result = a + b * c; // a + 250; 260;
printf("%i\n", result);
}
#include <stdio.h>
int main(){
// 整數(shù)除以整數(shù), 結(jié)果還是整數(shù)
printf("%i\n", 10 / 3); // 3
// 參與運(yùn)算的任何一個(gè)數(shù)是小數(shù), 結(jié)果就是小數(shù)
printf("%f\n", 10 / 3.0); // 3.333333
}
#include <stdio.h>
int main(){
// 10 / 3 商等于3, 余1
int result = 10 % 3;
printf("%i\n", result); // 1
// 左邊小于右邊, 那么結(jié)果就是左邊
result = 2 % 10;
printf("%i\n", result); // 2
// 被除數(shù)是正數(shù)結(jié)果就是正數(shù),被除數(shù)是負(fù)數(shù)結(jié)果就是負(fù)數(shù)
result = 10 % 3;
printf("%i\n", result); // 1
result = -10 % 3;
printf("%i\n", result); // -1
result = 10 % -3;
printf("%i\n", result); // 1
}
賦值運(yùn)算符
| 優(yōu)先級 | 名稱 | 符號(hào) | 說明 |
|---|---|---|---|
| 14 | 賦值運(yùn)算符 | = | 雙目運(yùn)算符,具有右結(jié)合性 |
| 14 | 除后賦值運(yùn)算符 | /= | 雙目運(yùn)算符,具有右結(jié)合性 |
| 14 | 乘后賦值運(yùn)算符 (模運(yùn)算符) | *= | 雙目運(yùn)算符,具有右結(jié)合性 |
| 14 | 取模后賦值運(yùn)算符 | %= | 雙目運(yùn)算符,具有右結(jié)合性 |
| 14 | 加后賦值運(yùn)算符 | += | 雙目運(yùn)算符,具有右結(jié)合性 |
| 14 | 減后賦值運(yùn)算符 | -= | 雙目運(yùn)算符,具有右結(jié)合性 |
- 簡單賦值運(yùn)算符
#include <stdio.h>
int main(){
// 簡單的賦值運(yùn)算符 =
// 會(huì)將=右邊的值賦值給左邊
int a = 10;
printf("a = %i\n", a); // 10
}
- 復(fù)合賦值運(yùn)算符
#include <stdio.h>
int main(){
// 復(fù)合賦值運(yùn)算符 += -= *= /= %=
// 將變量中的值取出之后進(jìn)行對應(yīng)的操作, 操作完畢之后再重新賦值給變量
int num1 = 10;
// num1 = num1 + 1; num1 = 10 + 1; num1 = 11;
num1 += 1;
printf("num1 = %i\n", num1); // 11
int num2 = 10;
// num2 = num2 - 1; num2 = 10 - 1; num2 = 9;
num2 -= 1;
printf("num2 = %i\n", num2); // 9
int num3 = 10;
// num3 = num3 * 2; num3 = 10 * 2; num3 = 20;
num3 *= 2;
printf("num3 = %i\n", num3); // 20
int num4 = 10;
// num4 = num4 / 2; num4 = 10 / 2; num4 = 5;
num4 /= 2;
printf("num4 = %i\n", num4); // 5
int num5 = 10;
// num5 = num5 % 3; num5 = 10 % 3; num5 = 1;
num5 %= 3;
printf("num5 = %i\n", num5); // 1
}
- 結(jié)合性和優(yōu)先級
#include <stdio.h>
int main(){
int number = 10;
// 賦值運(yùn)算符優(yōu)先級是14, 普通運(yùn)算符優(yōu)先級是3和4, 所以先計(jì)算普通運(yùn)算符
// 普通運(yùn)算符中乘法優(yōu)先級是3, 加法是4, 所以先計(jì)算乘法
// number += 1 + 25; number += 26; number = number + 26; number = 36;
number += 1 + 5 * 5;
printf("number = %i\n", number); // 36
}
自增自減運(yùn)算符
- 在程序設(shè)計(jì)中,經(jīng)常遇到“i=i+1”和“i=i-1”這兩種極為常用的操作。
- C語言為這種操作提供了兩個(gè)更為簡潔的運(yùn)算符,即++和--
| 優(yōu)先級 | 名稱 | 符號(hào) | 說明 |
|---|---|---|---|
| 2 | 自增運(yùn)算符(在后) | i++ | 單目運(yùn)算符,具有左結(jié)合性 |
| 2 | 自增運(yùn)算符(在前) | ++i | 單目運(yùn)算符,具有右結(jié)合性 |
| 2 | 自減運(yùn)算符(在后) | i-- | 單目運(yùn)算符,具有左結(jié)合性 |
| 2 | 自減運(yùn)算符(在前) | --i | 單目運(yùn)算符,具有右結(jié)合性 |
- 自增
- 如果只有單個(gè)變量, 無論++寫在前面還是后面都會(huì)對變量做+1操作
#include <stdio.h>
int main(){
int number = 10;
number++;
printf("number = %i\n", number); // 11
++number;
printf("number = %i\n", number); // 12
}
- 如果出現(xiàn)在一個(gè)表達(dá)式中, 那么++寫在前面和后面就會(huì)有所區(qū)別
- 前綴表達(dá)式:++x, --x;其中x表示變量名,先完成變量的自增自減1運(yùn)算,再用x的值作為表達(dá)式的值;即“先變后用”,也就是變量的值先變,再用變量的值參與運(yùn)算
- 后綴表達(dá)式:x++, x--;先用x的當(dāng)前值作為表達(dá)式的值,再進(jìn)行自增自減1運(yùn)算。即“先用后變”,也就是先用變量的值參與運(yùn)算,變量的值再進(jìn)行自增自減變化
#include <stdio.h>
int main(){
int number = 10;
// ++在后, 先參與表達(dá)式運(yùn)算, 再自增
// 表達(dá)式運(yùn)算時(shí)為: 3 + 10;
int result = 3 + number++;
printf("result = %i\n", result); // 13
printf("number = %i\n", number); // 11
}
#include <stdio.h>
int main(){
int number = 10;
// ++在前, 先自增, 再參與表達(dá)式運(yùn)算
// 表達(dá)式運(yùn)算時(shí)為: 3 + 11;
int result = 3 + ++number;
printf("result = %i\n", result); // 14
printf("number = %i\n", number); // 11
}
- 自減
#include <stdio.h>
int main(){
int number = 10;
// --在后, 先參與表達(dá)式運(yùn)算, 再自減
// 表達(dá)式運(yùn)算時(shí)為: 10 + 3;
int result = number-- + 3;
printf("result = %i\n", result); // 13
printf("number = %i\n", number); // 9
}
#include <stdio.h>
int main(){
int number = 10;
// --在前, 先自減, 再參與表達(dá)式運(yùn)算
// 表達(dá)式運(yùn)算時(shí)為: 9 + 3;
int result = --number + 3;
printf("result = %i\n", result); // 12
printf("number = %i\n", number); // 9
}
- 注意點(diǎn):
- 自增、自減運(yùn)算只能用于單個(gè)變量,只要是標(biāo)準(zhǔn)類型的變量,不管是整型、實(shí)型,還是字符型變量等,但不能用于表達(dá)式或常量
- 錯(cuò)誤用法:
++(a+b); 5++;
- 錯(cuò)誤用法:
- 企業(yè)開發(fā)中盡量讓++ -- 單獨(dú)出現(xiàn), 盡量不要和其它運(yùn)算符混合在一起
- 自增、自減運(yùn)算只能用于單個(gè)變量,只要是標(biāo)準(zhǔn)類型的變量,不管是整型、實(shí)型,還是字符型變量等,但不能用于表達(dá)式或常量
int i = 10;
int b = i++; // 不推薦
或者
int b = ++i; // 不推薦
或者
int a = 10;
int b = ++a + a++; // 不推薦
- 請用如下代碼替代
int i = 10;
int b = i; // 推薦
i++;
或者;
i++;
int b = i; // 推薦
或者
int a = 10;
++a;
int b = a + a; // 推薦
a++;
- C語言標(biāo)準(zhǔn)沒有明確的規(guī)定,
同一個(gè)表達(dá)式中同一個(gè)變量自增或自減后如何運(yùn)算, 不同編譯器得到結(jié)果也不同, 在企業(yè)開發(fā)中千萬不要這樣寫
int a = 1;
// 下列代碼利用Qt運(yùn)行時(shí)6, 利用Xcode運(yùn)行是5
// 但是無論如何, 最終a的值都是3
// 在C語言中這種代碼沒有意義, 不用深究也不要這樣寫
// 特點(diǎn): 參與運(yùn)算的是同一個(gè)變量, 參與運(yùn)算時(shí)都做了自增自減操作, 并且在同一個(gè)表達(dá)式中
int b = ++a + ++a;
printf("b = %i\n", b);
sizeof運(yùn)算符
-
sizeof可以用來計(jì)算一個(gè)變量或常量、數(shù)據(jù)類型所占的內(nèi)存字節(jié)數(shù)
- 標(biāo)準(zhǔn)格式: sizeof(常量 or 變量);
-
sizeof的幾種形式
- sizeof( 變量\常量 );
sizeof(10);char c = 'a'; sizeof(c);
- sizeof 變量\常量;
sizeof 10;char c = 'a'; sizeof c;
- sizeof( 數(shù)據(jù)類型);
sizeof(float);如果是數(shù)據(jù)類型不能省略括號(hào)
- sizeof( 變量\常量 );
-
sizeof面試題:
- sizeof()和+=、*=一樣是一個(gè)復(fù)合運(yùn)算符, 由sizeof和()兩個(gè)部分組成, 但是代表的是一個(gè)整體
- 所以sizeof不是一個(gè)函數(shù), 是一個(gè)運(yùn)算符, 該運(yùn)算符的優(yōu)先級是2
#include <stdio.h>
int main(){
int a = 10;
double b = 3.14;
// 由于sizeof的優(yōu)先級比+號(hào)高, 所以會(huì)先計(jì)算sizeof(a);
// a是int類型, 所以占4個(gè)字節(jié)得到結(jié)果4
// 然后再利用計(jì)算結(jié)果和b相加, 4 + 3.14 = 7.14
double res = sizeof a+b;
printf("res = %lf\n", res); // 7.14
}
逗號(hào)運(yùn)算符
- 在C語言中逗號(hào)“,”也是一種運(yùn)算符,稱為逗號(hào)運(yùn)算符。 其功能是把多個(gè)表達(dá)式連接起來組成一個(gè)表達(dá)式,稱為逗號(hào)表達(dá)式
- 逗號(hào)運(yùn)算符會(huì)從左至右依次取出每個(gè)表達(dá)式的值, 最后整個(gè)逗號(hào)表達(dá)式的值等于最后一個(gè)表達(dá)式的值
- 格式:
表達(dá)式1,表達(dá)式2,… …,表達(dá)式n;- 例如:
int result = a+1,b=3*4;
- 例如:
#include <stdio.h>
int main(){
int a = 10, b = 20, c;
// ()優(yōu)先級高于逗號(hào)運(yùn)算符和賦值運(yùn)算符, 所以先計(jì)算()中的內(nèi)容
// c = (11, 21);
// ()中是一個(gè)逗號(hào)表達(dá)式, 結(jié)果是最后一個(gè)表達(dá)式的值, 所以計(jì)算結(jié)果為21
// 將逗號(hào)表達(dá)式的結(jié)果賦值給c, 所以c的結(jié)果是21
c = (a + 1, b + 1);
printf("c = %i\n", c); // 21
}
關(guān)系運(yùn)算符
- 為什么要學(xué)習(xí)關(guān)系運(yùn)算符
- 默認(rèn)情況下,我們在程序中寫的每一句正確代碼都會(huì)被執(zhí)行。但很多時(shí)候,我們想在某個(gè)條件成立的情況下才執(zhí)行某一段代碼
- 這種情況的話可以使用條件語句來完成,但是學(xué)習(xí)條件語句之前,我們先來看一些更基礎(chǔ)的知識(shí):如何判斷一個(gè)條件是否成立
- C語言中的真假性
- 在C語言中,條件成立稱為“真”,條件不成立稱為“假”,因此,判斷條件是否成立,就是判斷條件的“真假”
-
怎么判斷真假呢?C語言規(guī)定,任何數(shù)值都有真假性,任何非0值都為“真”,只有0才為“假”。也就是說,108、-18、4.5、-10.5等都是“真”,0則是“假”
- 關(guān)系運(yùn)算符的運(yùn)算結(jié)果只有2種:如果條件成立,結(jié)果就為1,也就是“真”;如果條件不成立,結(jié)果就為0,也就是“假”
| 優(yōu)先級 | 名稱 | 符號(hào) | 說明 |
|---|---|---|---|
| 6 | 大于運(yùn)算符 | > | 雙目運(yùn)算符,具有左結(jié)合性 |
| 6 | 小于運(yùn)算符 | < | 雙目運(yùn)算符,具有左結(jié)合性 |
| 6 | 大于等于運(yùn)算符 | >= | 雙目運(yùn)算符,具有左結(jié)合性 |
| 6 | 小于等于運(yùn)算符 | <= | 雙目運(yùn)算符,具有左結(jié)合性 |
| 7 | 等于運(yùn)算符 | == | 雙目運(yùn)算符,具有左結(jié)合性 |
| 7 | 不等于運(yùn)算符 | != | 雙目運(yùn)算符,具有左結(jié)合性 |
#include <stdio.h>
int main(){
int result = 10 > 5;
printf("result = %i\n", result); // 1
result = 5 < 10;
printf("result = %i\n", result); // 1
result = 5 > 10;
printf("result = %i\n", result); // 0
result = 10 >= 10;
printf("result = %i\n", result); // 1
result = 10 <= 10;
printf("result = %i\n", result); // 1
result = 10 == 10;
printf("result = %i\n", result); // 1
result = 10 != 9;
printf("result = %i\n", result); // 1
}
- 優(yōu)先級和結(jié)合性
#include <stdio.h>
int main(){
// == 優(yōu)先級 小于 >, 所以先計(jì)算>
// result = 10 == 1; result = 0;
int result = 10 == 5 > 3;
printf("result = %i\n", result); // 0
}
#include <stdio.h>
int main(){
// == 和 != 優(yōu)先級一樣, 所以按照結(jié)合性
// 關(guān)系運(yùn)算符是左結(jié)合性, 所以從左至右計(jì)算
// result = 0 != 3; result = 1;
int result = 10 == 5 != 3;
printf("result = %i\n", result); // 1
}
- 練習(xí): 計(jì)算result的結(jié)果
int result1 = 3 > 4 + 7
int result2 = (3>4) + 7
int result3 = 5 != 4 + 2 * 7 > 3 == 10
- 注意點(diǎn):
- 無論是float還是double都有精度問題, 所以一定要避免利用==判斷浮點(diǎn)數(shù)是否相等
#include <stdio.h>
int main(){
float a = 0.1;
float b = a * 10 + 0.00000000001;
double c = 1.0 + + 0.00000000001;
printf("b = %f\n", b);
printf("c = %f\n", c);
int result = b == c;
printf("result = %i\n", result); // 0
}
邏輯運(yùn)算符
| 優(yōu)先級 | 名稱 | 符號(hào) | 說明 |
|---|---|---|---|
| 2 | 邏輯非運(yùn)算符 | ! | 單目運(yùn)算符,具有右結(jié)合性 |
| 11 | 邏輯與運(yùn)算符 | && | 雙目運(yùn)算符,具有左結(jié)合性 |
| 12 | 邏輯或運(yùn)算符 | || |
雙目運(yùn)算符,具有左結(jié)合性 |
- 邏輯非
- 格式:
! 條件A; - 運(yùn)算結(jié)果: 真變假,假變真
- 運(yùn)算過程:
- 先判斷條件A是否成立,如果添加A成立, 那么結(jié)果就為0,即“假”;
- 如果條件A不成立,結(jié)果就為1,即“真”
- 使用注意:
- 可以多次連續(xù)使用邏輯非運(yùn)算符
- !!!0;相當(dāng)于(!(!(!0)));最終結(jié)果為1
- 格式:
#include <stdio.h>
int main(){
// ()優(yōu)先級高, 先計(jì)算()里面的內(nèi)容
// 10==10為真, 所以result = !(1);
// !代表真變假, 假變真,所以結(jié)果是假0
int result = !(10 == 10);
printf("result = %i\n", result); // 0
}
- 邏輯與
- 格式:
條件A && 條件B; - 運(yùn)算結(jié)果:一假則假
- 運(yùn)算過程:
- 總是先判斷"條件A"是否成立
- 如果"條件A"成立,接著再判斷"條件B"是否成立, 如果"條件B"也成立,結(jié)果就為1,即“真”
- 如果"條件A"成立,"條件B"不成立,結(jié)果就為0,即“假”
- 如果"條件A"不成立,不會(huì)再去判斷"條件B"是否成立, 因?yàn)檫壿嬇c只要一個(gè)不為真結(jié)果都不為真
- 使用注意:
- "條件A"為假, "條件B"不會(huì)被執(zhí)行
- 格式:
#include <stdio.h>
int main(){
// 真 && 真
int result = (10 == 10) && (5 != 1);
printf("result = %i\n", result); // 1
// 假 && 真
result = (10 == 9) && (5 != 1);
printf("result = %i\n", result); // 0
// 真 && 假
result = (10 == 10) && (5 != 5);
printf("result = %i\n", result); // 0
// 假 && 假
result = (10 == 9) && (5 != 5);
printf("result = %i\n", result); // 0
}
#include <stdio.h>
int main(){
int a = 10;
int b = 20;
// 邏輯與, 前面為假, 不會(huì)繼續(xù)執(zhí)行后面
int result = (a == 9) && (++b);
printf("result = %i\n", result); // 1
printf("b = %i\n", b); // 20
}
- 邏輯或
- 格式:
條件A || 條件B; - 運(yùn)算結(jié)果:一真則真
- 運(yùn)算過程:
- 總是先判斷"條件A"是否成立
- 如果"條件A"不成立,接著再判斷"條件B"是否成立, 如果"條件B"成立,結(jié)果就為1,即“真”
- 如果"條件A"不成立,"條件B"也不成立成立, 結(jié)果就為0,即“假”
- 如果"條件A"成立, 不會(huì)再去判斷"條件B"是否成立, 因?yàn)檫壿嫽蛑灰粋€(gè)為真結(jié)果都為真
- 使用注意:
- "條件A"為真, "條件B"不會(huì)被執(zhí)行
- 格式:
#include <stdio.h>
int main(){
// 真 || 真
int result = (10 == 10) || (5 != 1);
printf("result = %i\n", result); // 1
// 假 || 真
result = (10 == 9) || (5 != 1);
printf("result = %i\n", result); // 1
// 真 || 假
result = (10 == 10) || (5 != 5);
printf("result = %i\n", result); // 1
// 假 || 假
result = (10 == 9) || (5 != 5);
printf("result = %i\n", result); // 0
}
#include <stdio.h>
int main(){
int a = 10;
int b = 20;
// 邏輯或, 前面為真, 不會(huì)繼續(xù)執(zhí)行后面
int result = (a == 10) || (++b);
printf("result = %i\n", result); // 1
printf("b = %i\n", b); // 20
}
- 練習(xí): 計(jì)算result的結(jié)果
int result = 3>5 || 2<4 && 6<1;
三目運(yùn)算符
三目運(yùn)算符,它需要3個(gè)數(shù)據(jù)或表達(dá)式構(gòu)成條件表達(dá)式
-
格式:
表達(dá)式1?表達(dá)式2(結(jié)果A):表達(dá)式3(結(jié)果B)- 示例:
考試及格 ? 及格 : 不及格;
- 示例:
-
求值規(guī)則:
- 如果"表達(dá)式1"為真,三目運(yùn)算符的運(yùn)算結(jié)果為"表達(dá)式2"的值(結(jié)果A),否則為"表達(dá)式3"的值(結(jié)果B)
示例:
int a = 10;
int b = 20;
int max = (a > b) ? a : b;
printf("max = %d", max);
輸出結(jié)果: 20
等價(jià)于:
int a = 10;
int b = 20;
int max = 0;
if(a>b){
max=a;
}else {
max=b;
}
printf("max = %d", max);
- 注意點(diǎn)
- 條件運(yùn)算符的運(yùn)算優(yōu)先級低于關(guān)系運(yùn)算符和算術(shù)運(yùn)算符,但高于賦值符
- 條件運(yùn)算符?和:是一個(gè)整體,不能分開使用
#include <stdio.h>
int main(){
int a = 10;
int b = 5;
// 先計(jì)算 a > b
// 然后再根據(jù)計(jì)算結(jié)果判定返回a還是b
// 相當(dāng)于int max= (a>b) ? a : b;
int max= a>b ? a : b;
printf("max = %i\n", max); // 10
}
#include <stdio.h>
int main(){
int a = 10;
int b = 5;
int c = 20;
int d = 10;
// 結(jié)合性是從右至左, 所以會(huì)先計(jì)算:后面的內(nèi)容
// int res = a>b?a:(c>d?c:d);
// int res = a>b?a:(20>10?20:10);
// int res = a>b?a:(20);
// 然后再計(jì)算最終的結(jié)果
// int res = 10>5?10:(20);
// int res = 10;
int res = a>b?a:c>d?c:d;
printf("res = %i\n", res);
}
類型轉(zhuǎn)換
| 強(qiáng)制類型轉(zhuǎn)換(顯示轉(zhuǎn)換) | 自動(dòng)類型轉(zhuǎn)換(隱式轉(zhuǎn)換) |
|---|---|
| (需要轉(zhuǎn)換的類型)(表達(dá)式) | 1.算數(shù)轉(zhuǎn)換 2.賦值轉(zhuǎn)換 |
- 強(qiáng)制類型轉(zhuǎn)換(顯示轉(zhuǎn)換)
// 將double轉(zhuǎn)換為int
int a = (int)10.5;
- 算數(shù)轉(zhuǎn)換
- 系統(tǒng)會(huì)自動(dòng)對占用內(nèi)存較少的類型做一個(gè)“自動(dòng)類型提升”的操作, 先將其轉(zhuǎn)換為當(dāng)前算數(shù)表達(dá)式中占用內(nèi)存高的類型, 然后再參與運(yùn)算
// 當(dāng)前表達(dá)式用1.0占用8個(gè)字節(jié), 2占用4個(gè)字節(jié)
// 所以會(huì)先將整數(shù)類型2轉(zhuǎn)換為double類型之后再計(jì)算
double b = 1.0 / 2;
- 賦值轉(zhuǎn)換
// 賦值時(shí)左邊是什么類型,就會(huì)自動(dòng)將右邊轉(zhuǎn)換為什么類型再保存
int a = 10.6;
- 注意點(diǎn):
- 參與計(jì)算的是什么類型, 結(jié)果就是什么類型
// 結(jié)果為0, 因?yàn)閰⑴c運(yùn)算的都是整型
double a = (double)(1 / 2);
// 結(jié)果為0.5, 因?yàn)?被強(qiáng)制轉(zhuǎn)換為了double類型, 2也會(huì)被自動(dòng)提升為double類型
double b = (double)1 / 2;
- 類型轉(zhuǎn)換并不會(huì)影響到原有變量的值
#include <stdio.h>
int main(){
double d = 3.14;
int num = (int)d;
printf("num = %i\n", num); // 3
printf("d = %lf\n", d); // 3.140000
}
階段練習(xí)
- 從鍵盤輸入一個(gè)整數(shù), 判斷這個(gè)數(shù)是否是100到200之間的數(shù)
- 表達(dá)式 6==6==6 的值是多少?
- 用戶從鍵盤上輸入三個(gè)整數(shù),找出最大值,然后輸入最大值
- 用兩種方式交換兩個(gè)變量的保存的值
交換前
int a = 10; int b = 20;
交換后
int a = 20; int b = 10;




