C語言學習總結(二) 運算流程,語言學習流程
第三章、基本運算
(運算符、算數運算符、關系運算符、邏輯運算符、三目運算符、ASXLL碼)
一、什麼是運算符?
概念:是編譯程序執行特定的算術或邏輯操作的符號;
分類:算術運算符、 關系運算符、邏輯運算符、按位運算符。
按照運算操作數分為:
運算遵循規則:數學的運算規則,先看優先級,再看結合律(從左到右【賦值運算為從右往左x=y=z】);

二、算術運算
“ + ”加法運算符 “ - ”減法運算符 “ * ” 乘法運算符 “ / ”除法運算符 “ % ” 取余運算符.
- 1.不同數據類型精度不一樣.double>float>int. 取余運算符只能整數;
- 2.若用高精度向低精度變量賦值.會丟失精度.如:int a=1.8;那麼a值是1.(非四捨五入)
- 3.運算優先級是.從左到右 但: * = / = % > + = - 如果要人為改變則加().
- 4.運算時兩個數據精度不一樣,會自動類型轉換,且是低精度向高精度轉換.
- 5.同精度運算只能得到同精度的結果.如果需要提高精度,需要強制類型轉換.
三、賦值運算
概念:把“=”號右面的值賦值給左邊的變量;
注意:等號的左邊一定是變量;
復合賦值運算符:+=, -=, *=, /=, %=;
四、自增自減運算符:
概念:讓連接的操作數自身的值+1或者-1
格式: 變量名++ ++ 變量名 變量名-- -- 變量名
- 1.變量才能自我變化,如自增或自減,但常量不能.
- 2. ++a,與a++,對a本身沒有區別,但是參與其它運算時,a++這個整體的值沒有變化.
五、siziof運算符
概念:計算常量、變量、數據類型在我們內存中占用的字節數;
用法:
注意事項:
六、關系運算
“ == ” “ > ” “ < ” “ >= ” “ <= ” “!=”
用法:對數據進行比較,看是否成立,條件成立=真(1),條件不成立=假(0).
- 1.關系運算符運算結果是一個int值.0或1.
- 2.優先級:>,<,>=,<=,優先級相等, 但大於==和!=.同時==與!=優先級相等.
- 3.如果優先級相同的兩個運算,先後順序看結合律(結合律指要麼從左往右運算,要麼從右往左運算),關系運算符結合律是從左往右,即:先看優先級,再看結合律.如下:
int b=1!=2>3<4; 等效於:2>3為假=0. 0<4為真=1, 1!=1為假=0.所以最終結果=0;
七、邏輯運算
“ ||”或 “ && ”與 “ ! ”非
用法:對於多個表達式進行並列真假判斷
注意:
- 1.所有數據都有真假值.0為假,其它的數都為真(規定). 結合律:從左往右執行,
- 2. 如果||表達式左邊表達式已經為真,則右邊不執行.而&&只要左邊為假右邊不執行.
- 3.優先級順序為:小括號() > 負號( -) > ! > 算術運算符 > 關系運算符 > && > ||
八、三目運算符--(可讀性差,一般不用)
定義:
<真假判斷表達式1>?<表達式2>:<表達式3>;
如: 1+2>4?2+2:3+4; 這個運算過程為:1+2=3, 3>4為假.則運行3+4這個表達式.所以最終結果為7.
九、ASCLL碼
概念:美國標准信息交換碼
字符運算會自動轉換成ASCLL表對應的值:
‘a’-‘b’ =( 97-98)
常用:
第二章、流程控制
(順序結構、選擇結構--if/swich、循環結構--do...while/for)
一、程序的結構
1.默認(順序結構):從上到下順序執行
2.選擇結構
是指編程中用來判定所給定的條件是否滿足,根據判定的結果(真或假)決定執行給出的兩種操作其中的一個
if分支語句:
--當程序執行的過程中有多個選擇時使用
格式:
1.if(表達式){
語句塊;
}
2.if(表達式1){
語句塊1;
}else if(表達式2){
語句塊2;
}else{
語句塊3;
}
等等............
表達式求值:如果表達式的值為非0(真) 會執行語句塊 0 (假) 不會執行語句塊,;
注意:
- 1.一次if語句只能執行給出的所有操作中的一個.
- 2.if();這種用法時if語句只有緊跟後面一句有效.(讀到下一個;號結束).且不能定義變量
- 3.除了if();這種用法,所有的if()與{}之間不能有;號
- 4.if(條件判斷){},裡面的條件判斷如果是與常量的等於判斷,則常量寫在前面(建議);
- 5.if(1)、if(-1)、if(a=5) 永真 if(0) 永假 ;
- 6.if(表達式) return 0; //程序退出,代碼不會再往下執行了
swich分支語句
--同if一樣也用於條件判斷,當表達式的結果有多種情況時用switch比較方便
格式:
switch(表達式){ --->表達式:返回值是整型
case 常量1: 語句1; --->常量必須是整型
break;
case 常量n; 語句n; --->語句中定義變量會造成作用於紊亂:(int a=10)錯!
break;
default: 語句n;
如果上面條件都不滿足執行default;
}
注意:
- 1.條件結果只能是整數,而case只能是整型常量.注意:case ‘a’;
- 2.break 可有可無,有則執行完跳出,沒有則繼續執行,直到遇到下一個break或執行完.
- 3.default可有可無,有則如果條件都不滿足,會執行這句,無則條件都不滿足,執行結束.
- 4.case下面要定義變量必須加{}.且case後的常量值不能重復
- 5.switch語句可以全部用if語句替代.但if語句不能全用switch替代.
break和continue關鍵字使用:
概念:
break和continue語句都可以用在循環中,用來跳出循環(結束循環);
break語句還可以用 在switch語句中,用來跳出switch語句。
注意:
// if(表達式)else{ ...... break;......}
1)break語句對if-else的條件語句不起作用;
2)在多層循環中,一個break語句只向外跳一層。
3)continue表示跳過本次循環,而不是跳出循環體;
3.循環語句
概念:
是指編程循環語句,當滿足條件時進入循環,循環判斷,直到不滿足條件跳出循環,根據條件反復執行一段代碼的時候用
1.while語句:
格式:
while (條件) { ---先判斷再執行:條件為真執行代碼塊,條件為假不執行;
語句塊;
}
注意:
int num = 3;
while (3 == num) {
printf("num = %d\n",num);
num++;
}
1、通常把常量寫在前面
2、while 後如果只有一條語句它可以省略大括號
3、while小闊號後面不可以直接寫分號(沒有意義)
4、作用域:內部代碼塊中定義的變量不可以在外邊代碼塊中訪問
5、作用域紊亂:while (1 < 3) int num = 5;
6、最簡單死循環(條件一直為真,循環無法結束):while (1);
2.do...whlie語句:
格式:
do{
語句塊;
} while(條件);
特點:與while相比,先執行後判斷,至少會執行一次語句塊;
3.for語句:
格式:
for(表達式1 ;表達式2 ;表達式3 ){ ---3個語句,2個分號隔開。
語句塊4;
}
執行過程:
1—>2—>4—>3—>2—>4—>3......
表達式1:循環變量初賦值,開始前執行,只執行一次;
表達式2:循環條件,為真,就執行語句塊4的代碼。為假,循環結束;
表達式3:循環變量增值:每次執行完畢後執行;
注意:
- 1.如果碰到continue,則跳出本次循環繼續下一次判斷,如果條件成立繼續執行循環.
- 2.如果碰到break無論條件滿足與否,循環立刻結束.
- 3.continue與break跳出的都是當前所在的循環作用域.如果外層有循環,不受影響.
- for(; ;) 語句相當於while(1) 語句,為死循環。
for循環的嵌套:
1.for(int a=0;a<5;a++){
語句塊1;
for(int b=0;b<10;b++){
語句塊2;
}
}
核心:
案例1:(while)

![]()
1 思路:
2 1)接收用戶輸入的字符串
3 2)判斷用戶是不是敲了回車鍵
4 //定義字符變量接收字符
5 char ch;
6 //定義一個計數器變量,用於保存字符的個數
7 int count=0;
8 //接收用戶輸入的字符串的第一個字符
9 scanf("%c",&ch);
10 //通過循環依次獲取輸入緩沖區的其他字符
11 //ch = '\n' 判斷取到的字符是否是換行符
12 //此處如果是換行符,表示用戶輸入結束
13 while (ch!='\n') {
14 //計數器+1
15 count++;
16 //再次獲取輸入緩沖區的下一個字符 scanf("%c",&ch);
17 }
18 }
19 //打印計數器的值 printf("count = %d\n",count);
統計從鍵盤輸入一行字符的個數
案例2:(while,switch)

![]()
1 思路:
2
3 1)一直循環等待用戶輸入
4
5 2)輸入四個字符,打印對應的方向
6
7 switch
8
9 //定義變量存儲用戶輸入的內容
10
11 char ch;
12
13 //定義標志,0-正常,1-退出
14 int flag=0;
15 printf("請控制小人移動:w.上 s.下 a.左 d.右 q.退出\n");
16
17 while (!flag) {
18
19 scanf("%c",&ch); switch (ch) {
20
21 //判斷用戶輸入了大寫和小寫的w的情況
22
23 case 'w':
24 case 'W':
25
26 printf("上\n");
27
28 break;
29
30 //判斷用戶輸入了大寫和小寫的s的情況
31
32 case 's':
33
34
35 case 'S':
36
37 printf("下\n");
38
39 break;
40
41 //判斷用戶輸入了大寫和小寫的a的情況
42
43 case 'a':
44 case 'A':
45
46 printf("左\n");
47
48 break;
49
50 //判斷用戶輸入了大寫和小寫的d的情況
51
52 case 'd':
53 case 'D':
54
55 printf("右\n");
56
57 break;
58
59 case 'q':
60
61 case 'Q':
62
63 printf("已退出\n");
64
65 flag = 1;
66 break;
67
68 } }
輸入wsad,打印對應的方向
案例3:(if...else,while)

![]()
1 思路
2 //1、定義變量,保存玩家競猜的數字和電腦隨機產生的數字
3 //2、讓電腦隨機產生一個1-1000之間的數
4 /*
5 難點:如何產生1-1000的數?
6 arc4random_uniform(1000) 產生的是 0-999之間的整數
7 arc4random_uniform(1001) 產生的是 0-1000之間的整數,
8 我們要求的是1-1000,所以不符合
9 arc4random_uniform(1000)+1 產生的是:0(+1)-999(+1),是 1-1000之間的數
10 得出結論: 要產生m,n之間的隨機數公式
11 arc4random_uniform(n-m+1)+m
12 如產生 10-50之間的隨機數
13 arc4random_uniform(50-10+1)+10;
14 1-1000之間的隨機數
15 arc4random_uniform(1000-1+1)+1
16 */
17 //3、通過循環控制,讓用戶最多可以競猜10次
18 // 判斷如果競猜的數字>隨機產生的數