- 一個(gè)C程序就是由若干頭文件(#include)和函數(shù)組成,并有且只有一個(gè)主函數(shù)
- 在最新的C標(biāo)準(zhǔn)中,main函數(shù)前的類型為int而不是void(表示無(wú)類型沒(méi)有返回值)
- 單行注釋: //、多行注釋: /* */
- 標(biāo)識(shí)符:盡量不超8位、分大小寫、非關(guān)鍵字、有意義
- 變量賦值的兩種方式:1.先聲明再賦值 2.聲明的同時(shí)賦值
-
基本數(shù)據(jù)類型分四大類:
- 普通整型int,字符型char,浮點(diǎn)型float,雙精度浮點(diǎn)型double
- 常量分為直接常量(即字面量)和符號(hào)常量(需要#define 標(biāo)識(shí)符 常量值來(lái)定義)
- 變量可在編譯時(shí)可自動(dòng)類型轉(zhuǎn)換,char類型數(shù)據(jù)轉(zhuǎn)換為int類型數(shù)據(jù)遵循ASCII碼中的對(duì)應(yīng)值,字節(jié)小的可以向字節(jié)大的自動(dòng)轉(zhuǎn)換,但字節(jié)大的不能向字節(jié)小的自動(dòng)轉(zhuǎn)換
- 強(qiáng)制類型轉(zhuǎn)換((數(shù)據(jù)類型) (表達(dá)式)):必須加括號(hào);不會(huì)修改原值;不遵循四舍五入原則
- 算數(shù)運(yùn)算符:加+ 減- 乘* 除/ 求余%(運(yùn)算后的符號(hào)取決于被模數(shù)的符號(hào)) 自增++ 自減--
- 關(guān)于自增運(yùn)算符:-/+號(hào)在前:先運(yùn)算再取值,在后則反之
- 復(fù)合賦值運(yùn)算符:即在簡(jiǎn)單運(yùn)算符前面加=(如+=)
- 關(guān)系運(yùn)算符: > >= < <= == !=
- 邏輯運(yùn)算符:與&& 或|| 非!
- 三目運(yùn)算符:表達(dá)式1? 表達(dá)式2:表達(dá)式3
- 分支結(jié)構(gòu):
if (表達(dá)式){
代碼塊
if (表達(dá)式){ // 嵌套if-else語(yǔ)句
代碼塊Inner
}
}
[else if (表達(dá)式2)]{ // 多重if-else語(yǔ)句
代碼塊2
}
[else]{
代碼塊3
}
- 循環(huán)結(jié)構(gòu):while循環(huán)、do-while循環(huán)(先do再循環(huán),while后面需有分號(hào))、for循環(huán)(1初始;2判斷;3步進(jìn),分號(hào)不能省略,變量要在for之前定義)
- 用循環(huán)結(jié)構(gòu)和操作運(yùn)算符實(shí)現(xiàn)水仙花數(shù)字:
/*所謂“水仙花數(shù)”是指一個(gè)三位數(shù),其各位數(shù)字立方和等于該數(shù)*/
#include <stdio.h>
int main()
{
//定義三位數(shù)num,個(gè)位數(shù)sd,十位數(shù)td,百位數(shù)hd
int num, sd, td, hd;
//循環(huán)所有三位數(shù)
for(num=100; num < 1000; num++)
{
// printf("%d", num);
// 獲取三位數(shù)字num百位上的數(shù)字
hd = num/100 ;
//獲取三位數(shù)字num十位上的數(shù)字
td = num/10%10 ;
//獲取三位數(shù)字num個(gè)位上的數(shù)字
sd = num%10 ;
//水仙花數(shù)的條件是什么?
if(hd * hd * hd + td * td * td + sd * sd * sd == num)
{
printf("水仙花數(shù)字:%d\n", num);
}
}
return 0;
}
- 多重循環(huán):一般用2~3層循環(huán),父循環(huán)執(zhí)行一次,子循環(huán)需要全部執(zhí)行完,直到跳出循環(huán)
- 分支結(jié)構(gòu)switch:
switch(表達(dá)式){
case1 exp1: code1; break; // case后的各常量表達(dá)式不能相同,否則報(bào)錯(cuò)
case2 exp2: code2; break; // 代碼塊后面的分號(hào)不要忘
caseN expN: codeN; break;
[default: codeX; break;]
}
switch后面的表達(dá)式語(yǔ)句只能是整型或字符型
在case后,允許有多個(gè)語(yǔ)句,可以不用{}括起來(lái)
case和default子句的順序可以變動(dòng),結(jié)果不變
- goto語(yǔ)句:執(zhí)行后,程序?qū)⑻D(zhuǎn)到定義的標(biāo)識(shí)符(一般用英文大寫)處并執(zhí)行其后的語(yǔ)句
- 函數(shù)的定義:
/*其中[]內(nèi)為可選內(nèi)容*/
[數(shù)據(jù)類型說(shuō)明] 函數(shù)名([參數(shù)]){ // 數(shù)據(jù)類型默認(rèn)是int
執(zhí)行代碼塊;
return (表達(dá)式);
}
自定義函數(shù)盡量放在main函數(shù)之前,如果在其后需要在前面先聲明
形參是用來(lái)接收調(diào)用該函數(shù)時(shí)傳入的參數(shù),
實(shí)參是在調(diào)用時(shí)傳遞該函數(shù)的參數(shù)
遞歸函數(shù):自我調(diào)用且有完成狀態(tài),具有遞推和回推兩個(gè)階段
- 函數(shù)返回值為三目運(yùn)算符的寫法:
return 判斷?表達(dá)式1:表達(dá)式2; - 變量存儲(chǔ)類別:按生存周期可分為靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式;按存儲(chǔ)類別可分:自動(dòng)auto(可省略)、靜態(tài)static(分局部和外部)、來(lái)自寄存器register、來(lái)自外部extern
- 靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)類別,只賦初值一次(如無(wú)賦值則默認(rèn)為0或空字符)
- 只有局部自動(dòng)變量和形式參數(shù)可以作為寄存器變量,不能定義任意多個(gè)寄存器變量(有限)
- 外部變量的意義是某函數(shù)可以調(diào)用在該函數(shù)之后定義的變量
- 內(nèi)部函數(shù):不能被其他源文件調(diào)用的函數(shù)(也稱靜態(tài)函數(shù)),用
static定義
外部函數(shù)(系統(tǒng)默認(rèn)):能被其他源文件調(diào)用的函數(shù),用extern定義 - 數(shù)組:一塊連續(xù)的、大小固定、數(shù)據(jù)類型一致的內(nèi)存空間(數(shù)組是相同類型變量集合);
三種初始化:-
數(shù)據(jù)類型 數(shù)組名稱[數(shù)組長(zhǎng)度n] = {元素1, 元素2...元素n}(當(dāng)元素小于長(zhǎng)度,多余的元素默認(rèn)為0) 數(shù)據(jù)類型 數(shù)組名稱[] = {元素1, 元素2...元素n}-
數(shù)據(jù)類型 數(shù)組名稱[數(shù)組長(zhǎng)度n];數(shù)組名稱[0] = 元素1;數(shù)組名稱[1] = 元素2;數(shù)組名稱[n-1] = 元素n
在聲明數(shù)組后沒(méi)有進(jìn)行初始化的時(shí)候,static和extern類型的數(shù)組元素初始化元素為0,auto類型的數(shù)組的元素初始化值不確定
-
27.字符串是用數(shù)組定義的:
法1:
char 字符串名[長(zhǎng)] = "字符串值"
法2(在數(shù)組中不能寫中文):
char 字符串名[長(zhǎng)] = {'字符1', '字符2', '字符3', .... '字符n', '\0'} //注意末尾的\0字符是結(jié)束標(biāo)志
/*字符串?dāng)?shù)組當(dāng)作形參時(shí)的寫法*/
void foo(char stringname[]){
return;
}
常用字符串函數(shù):strlen(), strcmp(s1, s2), strcat(s1, s2), strcpy(s1, s2), atoi(s1)
- 多維數(shù)組:數(shù)組名后跟n個(gè)維度(稱作第一維下標(biāo)...第n維下標(biāo)),使數(shù)組中的元素可以再用下標(biāo)訪問(wèn),如下
int number[2][5] = {{11,12,13,14,15}, {21,22,23,24,25}}
可看作一個(gè)2×5的二位矩陣;多維數(shù)組的初始化與數(shù)組類似:-
數(shù)據(jù)類型 數(shù)組名稱[常量表達(dá)式1][常量表達(dá)式2]...[常量表達(dá)式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};(必須指定列的維數(shù),系統(tǒng)會(huì)根據(jù)元素總個(gè)數(shù)分配空間,當(dāng)知道元素總個(gè)數(shù)以及列的維數(shù)后,會(huì)直接計(jì)算出行的維數(shù)) -
數(shù)據(jù)類型 數(shù)組名稱[常量表達(dá)式1][常量表達(dá)式2]...[常量表達(dá)式n]; 數(shù)組名稱[下標(biāo)1][下標(biāo)2]...[下標(biāo)n] = 值;(需要同時(shí)指定行和列的維數(shù))
-
- 求二維數(shù)組的對(duì)角線之和:
#include <stdio.h>
int main()
{
int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
int i,j;
int sum=0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++){
if((i+j)%2==0) //關(guān)鍵點(diǎn)
sum+= arr[i][j];
}
}
printf("對(duì)角線元素之和是:%d\n",sum);
return 0;
}
- 結(jié)構(gòu)體:是用戶自定義的可用數(shù)據(jù)類型,可存儲(chǔ)不同類型變量集合(與數(shù)組相反),有幾種定義方法:
// 這里是定義了一個(gè)結(jié)構(gòu)體類型
struct weapon{
char name[20];
int cost;
char memo[100];
};
// 法1:聲明和定義分離的形式
struct weapon weapon_number1;
// 法2:在聲明的時(shí)候定義,即在尾部加變量名
struct weapon{
char name[20];
int cost;
char memo[100];
}weapon_number2;
// 法3:不指定結(jié)構(gòu)體名字,直接定義變量
struct{
char name[20];
int cost;
char memo[100];
}weapon_number3;
初始化:用{}把常量依次傳入,即weapon_number1={"gun", 70, "warning"}
訪問(wèn)成員的值:用.(成員運(yùn)算符),weapon_number1.name
結(jié)構(gòu)體數(shù)組的聲明:由結(jié)構(gòu)體組成的數(shù)組
struct weapon weapon_numbers[2] // 初始化時(shí)需要依次指定6個(gè)常量
結(jié)構(gòu)體指針:
// 指針變量c指向結(jié)構(gòu)體weapon_number1
struct weapon * c;
c=&weapon_number1;
//調(diào)用結(jié)構(gòu)體成員,可用c->name替代(->稱作指向運(yùn)算符);
(*c).name; // 指針兩側(cè)變量不能省略(因成員運(yùn)算符.的優(yōu)先級(jí)高于*)
