數據類型轉換:
1.當賦值符號兩邊的數據類型不同的時候,數據類型轉換是自動的,不需要程序員插手
當給 int 類型的變量賦值的時候:
1).如果我們賦值的數據超出 int 的范圍,這個時候 c 會將數據為 1 個隨機的 int 數據.
int num =2200000000;
printf("num = %d\n",num);//num = -2094967296(后面學了進制就知道這個數怎么來的)
2).如果我們賦值的數據超出 int 的范圍太多,這個時候自動類型轉換就無能為力,編譯器直接報錯.
3).如果我們賦值的數據是一個小數,這個時候 c 會直接截取整數部分.
當給 float 類型的變量賦值的時候:
如果我們用一個double類型的小數給float變量賦值,會把double類型的浮點數轉換成float類型小數,不會報錯,精度丟失
2).如果我們用一個?int類型數給float變量賦值,那么就將這個整數轉換成float類型小數,所以在賦值的時候加一個 .0f!!!
當給 double 類型的變量賦值的時候:
1).如果我們用一個float類型的小數給double變量賦值,會把float類型的浮點數轉換成double類型小數,不會報錯,精度提高
2).如果我們用一個?int類型數給double變量賦值,那么就將這個整數轉換成double類型小數,所以在賦值的時候加一個 .0!!!
當給 char 類型的變量賦值的時候:
1).ASCII碼:
只要記住這3個,其他的,推出來
'A' 65
'a' 97
'0' 48
2).如果我們用一個?int類型數給 char變量賦值,其實在賦值的時候是以這個整數為 ASCII 碼所對應的字符數據.
scanf函數的簡單使用:
a:在格式控制符中用占位符來要求用戶輸入 1 個指定類型的數據.
b:在后面寫上要將用戶輸入的數據到 1 個變量的地址,用 & 就可以取到變量的地址.
c:如果程序沒有輸出信息,下面的控制臺輸出區域不會自動彈出來的.
注意:scanf函數是一個阻塞式函數,用戶不輸入,就不會往下執行。
scanf函數接收各個類型的數據:
1).使用 scanf 函數接收其他類型的數據,想要讓用戶輸入什么類型的數據,是根據格式占位符來決定的
%d用戶輸入 int的數據scanf("%d", &變量名);
%f用戶輸入 float的數據scanf("%f", &變量名);
%lf用戶輸入 double的數據scanf("%lf", &變量名);
%c用戶輸入 char的數據scanf("%c", &變量名);
2).scanf函數使用的步驟:
3).使用scanf函數需要注意的細節
1.定義變量的時候不要再用a,b,c
2.注釋要寫
3.scanf函數習慣性的加了\n,這個一定一定要注意,scanf函數雙引號里不能加\n
\n可以過濾多個空白字符(換行符,制表符和空格),直到遇到非空白符的時候才終止輸入。但那個非空白符并沒有讀到scanf里
4.不要忘記加&? --->奔潰
5.scanf里面的格式控制符,一定要和你要輸入的變量的類型一致,否則會出問題
4).使用scanf函數一次接收輸入多個數據
1.沒有自定義分隔符(分隔符默認是空格/回車/tab)
1).此時如果要求輸入的是整數或者浮點數,輸入過程中的回車/空格/tab,都會被忽略.
int num_int1 =0;
float num_f =0.0f;
int num_int2 =0;
printf("輸入前%d-%f-%d\n",num_int1,num_f,num_int2);
scanf("%d%f%d",&num_int1,&num_f,&num_int2);
printf("輸入后%d-%f-%d\n",num_int1,num_f,num_int2);
輸入前0-0.000000-0
1 12.34 111
輸入后1-12.340000-111
Program ended with exit code: 0
2).如果有字符,如果在輸入字符之前有多余的操作(空格/回車/tab),數據的賦值就會有問題.
int num_int =0;
char num_char ='a';
int num_int2 =0;
printf("輸入前%d-%c-%d\n",num_int,num_char,num_int2);
scanf("%d%c%d",&num_int,&num_char,&num_int2);
printf("輸入后%d-%c-%d\n",num_int,num_char,num_int2);
輸入前0-a-0
12 b 13 ? ? //12 空格 b?空格 13 回車
輸入后12- -0 ? ? //12-空格-0
Program ended with exit code: 0
2.自定義分隔符
1).一旦指定,就要嚴格按照自定義的分隔符進行分割,絕對沒有問題的
int num_int1 =0;
char num_char ='a';
int num_int2 =0;
printf("輸入前%d-%c-%d\n",num_int1,num_char,num_int2);
scanf("%d--%c--%d",&num_int1,&num_char,&num_int2);
printf("輸入后%d-%c-%d\n",num_int1,num_char,num_int2);
這里的自定義分隔符是"--"
輸入前0-a-0 ? ? //沒有按照自定義的分隔符 "--" 進行分割,出問題了
12-b-13 ? ? //12 - b - 13?回車
輸入后12-a-0
Program ended with exit code: 0
輸入前0-a-0 ? ? //按照自定義的分隔符 "--" 進行分割,沒有出問題
12--b--13?????//12 -- b -- 13?回車
輸入后12-b-13
Program ended with exit code: 0
3.scanf函數的緩沖區
1.當控制臺停下來等待你輸入,說明緩沖區是空的
2.你輸入的所有數據都會存儲到緩沖區,然后程序從緩沖區拿數據向變量賦值
3.只要緩沖區有數據,程序再遇到scanf語句,就不會在控制臺等待你輸入,
4.程序從緩沖區拿數據,如果是給浮點數或者整數賦值,忽略空格/tab/回車,"給字符賦值,不忽略回車
例子1:輸入1空格2空格3回車
int num1=0,num2=0,num3=0;
printf("輸入前%d-%d-%d\n",num1,num2,num3);
printf("請輸入:"); ? ? //輸入1空格2空格3回車
scanf("%d%d",&num1,&num2);
printf("----------------\n");
scanf("%d",&num3);
printf("輸入后%d-%d-%d\n",num1,num2,num3);
結果是:
輸入前0-0-0
請輸入:1 2 3
----------------
輸入后1-2-3
Program ended with exit code: 0
從上面可以看出當從緩沖區中拿數據的時候,如果要拿的數據是整型或者實型,如果拿到的是空格 回車 Tab鍵,就會自動忽略,繼續往下拿.
例子2:
int num1 =1;
char num_c ='a';
printf("輸入前:%d-%c\n",num1,num_c);
printf("請輸入:");
scanf("%d",&num1);
scanf("%c",&num_c);
printf("輸入后:%d-%c\n",num1,num_c);
結果是:
從上面可以看出當從緩沖區中拿數據的時候,如果要拿的數據是字符型不會自忽略任何數據.
***所以我們可以用清空緩沖區的方式來解決上面的問題***
int num1 =1;
char num_c ='a';
printf("輸入前:%d-%c\n",num1,num_c);
printf("請輸入:");
scanf("%d",&num1);
rewind(stdin);//清空緩沖區
scanf("%c",&num_c);
printf("輸入后:%d-%c\n",num1,num_c);
return0;
結果是:
輸入前:1-a
請輸入:10 ? ? //輸入10回車 b回車
b
輸入后:10-b
Program ended with exit code: 0
務必記住:凡是需要輸入字符,請你單獨寫一句scanf函數,并且前面加上rewind(stdin)
交換兩個變量的值:
1.第一種方式:
int num1 =5;
int num2 =10;
printf("交換前:num1 = %d? num2 = %d\n", num1, num2);
int tempNum = num1;//tempNum = 5 num1 = 5
num1 = num2;//num1 = 10 num2 = 10
num2 = tempNum;//num2 = 5 tempNum = 5
printf("交換后:num1 = %d? num2 = %d\n", num1, num2);
交換前:num1 = 5? num2 = 10
交換后:num1 = 10? num2 = 5
Program ended with exit code: 0
2.第二種方式:兩數相加再相減
int num1 =5;//初始值
int num2 =10;//初始值
printf("交換前:num1 = %d ? num2 = %d\n", num1, num2);
num1 = num1 + num2;// num1 = num1的初始值+ num2的初始值
num2 = num1 - num2;//num2 = num1的初始值+ num2的初始值- num2的初始值num2 =? num1的初始值
num1 = num1 - num2;// num1 = num1的初始值+ num2的初始值- num1的初始值num1 = num2的初始值
printf("交換后:num1 = %d ? num2 = %d\n", num1, num2);
交換前:num1 = 5 ? num2 = 10
交換后:num1 = 10 ? num2 = 5
Program ended with exit code: 0
算術運算符和算術表達式:
算術運算符:+ - * / %
算術表達式:由算術運算符連接起來的式子
1.算數表達式的值有類型.算數表達式最終結果類型,取決于精度最高的那個數.
double>float>int
2.當參與運算的數據類型一致,算數運算表達式的結果的類型就是參與運算的數據的類型
分析下面代碼段:
//先聲明變量,再計算表達式的結果,最后將表達式的結果賦值給變量
int result =1/3;//0.3333
printf("%d\n",result);//0
doubleresult =1/3;//0.3333333??? 0 ? --- > 0.000000
printf("%lf\n",result);//0.000000
上面的算數表達式都是 int 類型的,所以這個表達式的結果是 0 ,不是 0.3333
如何獲取兩個整數的真實的商?
//思路:定義操作數為double類型、或者操作數*1.0
double result = (double)1/3;
printf("%lf\n",result);//0.333333
3.%求模運算
1>浮點數不能參與求模運算,沒有意義
2> m % n求余的結果一定是0~ n-1之間
m%n求余
(1)n 等于0無意義
(2)m 等于0結果為0
(3)m>n 正常求余如:8%3=2
(4)m<n 結果是m如:2%4=21%4=13%8=3
算術運算符的優先級和char數據參與算術運算:
1.* / %優先級相等并且高于+ - (+ -優先級相同),如果同級別,從左到右運算,如果有小括弧,就先算小括弧里的表達式.
2.char變量/常量和整數一起運算,直接拿ASCII碼進行運算
int sum ='a'+3;// 'a' -->97 + 3 ---> 100
printf("%d\n", sum);//100
char char_b ='b';
sum =3+ char_b;// 'b' -->98 + 3 --->101
printf("%d\n", sum);//101
3.如何把小寫的字母轉化為大寫
'A'--->65 ? ? ? ? ? ? ? ? ?'a'--->97
'B'--->66 ? ? ? ? ? ? ? ? ?'b'--->98
小寫-->大寫-32 ? ? ? ? 大寫-->小寫+32
復合賦值運算符:
1.常見的復合賦值運算
int num =10;
+=比如: num +=10; --->等價于num = num +10;
-=比如: num -=10; --->等價于num = num -10;
*=比如: num *=10; --->等價于num = num *10;
/=比如: num /=10; --->等價于num = num /10;
%=比如: num %=10; --->等價于num = num %10;
2.如果以后想在一個變量自身的基礎上改變當前的值,就可以使用復合賦值運算符
自增與自減運算:
1)前綴表達式:++x, --x;其中x表示變量名,先完成變量的自增自減1運算,再用x的值作為表達式的值;即“先變后用”,也就是變量的值先變,再用變量的值參與運算。
2)后綴表達式:x++, x--;先用x的當前值作為表達式的值,再進行自增自減1運算。即“先用后變”,也就是先用變量的值參與運算,變量的值再進行自增自減變化。
注意:不管“++”在前還是在后,最后變量的值都會+1
a++? -->后自增表達式-->整個a++的表達式的值是a ? --> a變量的值是a+1;
++a? -->前自增表達式-->整個++a的表達式的值是a+1--> a變量的值是a+1;
a--? --> a--表達式的值是a ? -->? a變量的值a-1
--a? --> --a表達式的值是a-1-->? a變量的值a-1
逗號表達式:
1.知道逗號表達式的結構(AAA,BBB,CCC)
2.執行過程從左向右執行
3.整個逗號表達式的結果是最后一個式子也就是CCC的值.
4.逗號表達式的目的,只要前面的表達式執行,關心最后一個表達式的結果是多少,因為我們前面的表達式一旦執行就會影響最后一個表達式的結果
比較運算符和比較表達式:
1.比較運算符:
> ?????大于
< ?????小于
>= ? ? 大于等于
<= ? ??小于等于
== ? ? 等于
!= ? ? 不等于
2.比較運算符的作用:比較大小的
3.比較表達式:由比較運算符連接起來的式子
4.比較表達式的結果:
比較表達式用來比較若干數據之間的大小關系,
比較表達式的結果是0或者 非0,0表示不成立非0表示成立
5.優先級:
> < >= <=的優先級相等
== !=的優先級相等
> < >= <=的優先級高于== !=的優先級
比較運算表達式的場景:
1.比較運算符的兩邊可以是常量或者是變量
int result =1>2;// 0//常量
int num=1;//變量
int result2 = num <2;// 1
2.比較運算符的兩邊可以分別是表達式
int num =10;
int result =11- num < num *2;// 1<20 --->1
算術運算符的優先級比關系運算符的優先級高,一個式子里面既有比較運算符又有算數運算符就先算數運算符,再算比較運算符.
3.char類型的變量或者常量也可以參與比較運算符,比較的是相應的ASCII碼
邏輯運算符:
&&邏輯與并且
||邏輯或或者
!邏輯非取反
1.計算機的世界中,"非0就是真,0就是假
2.輸入一個年份,判斷是不是閏年
(年份%400==0) || (年份%4==0)&&(年份%100!=0)
邏輯與運算符
A && B
1.&&邏輯與運算符運算規則
A和B都是真結果才是真,A和B有一個是假,結果就是假)("同真則真,一假則假")
2.斷路問題
A是假,B將不會再進行判斷,整個式子是假的
邏輯或運算符
A || B
1.||邏輯與運算符運算規則
A和B只要有一個是真結果就是真,A和B都是假,結果才是假"一真則真,同假為假"
2.斷路問題
A是真,B將不會再進行判斷,整個式子是真
!邏輯非運算規則
真變假 假變真 非零變0 0變1
邏輯運算符的優先級和結合性
1.什么是優先級
當一個表達式中,有各種各樣的不同類型的運算符的時候,此時應該先計算哪一個運算符?
解決這個問題的方案就是優先級
2.什么是結合性
當一個表達式中存在運算符的優先級相等的時候,此時應該從左向右運算還是從右向左運算
解決這個問題的方案就是結合性
斷路問題
1.當自增自減運算和邏輯運算組合時,編譯器編譯代碼的時候,放棄優先級,從左向右掃描,最后去判斷自增自減要不要去執行
2.當邏輯&&和邏輯||組合運算時,仍然是放棄優先級,從左向右掃描,如果有斷路,后面的就不執行,如果沒有斷路,那么就按照正常的優先級來計算