C語言基礎(chǔ)
程序編譯
- gcc xx.c會默認(rèn)生成一個a.out的可執(zhí)行文件,在a.out所在目錄下執(zhí)行,執(zhí)行./a.out
- 程序編譯可以用gcc XX.c -o XX ,注意不要命名成xx.c,這樣會覆蓋原先的xx.c文件內(nèi)容。
- gcc xx.c -o xx -g -wall,-g -wall的意思是開啟所有的語法警告。
- gcc只檢查語法錯誤,不會檢查邏輯錯誤。
- 每次修改完程序,都必須要執(zhí)行一次gcc。
hello world程序
int main()
{
return 0;
}
- 可執(zhí)行程序一執(zhí)行,就會去找一個叫做main的函數(shù),然后運行main{}里的語句。
- 一個.c文件有且只能有一個main的函數(shù)。
- 一個函數(shù)碰到return就會結(jié)束,return后面的語句將永遠(yuǎn)不會被執(zhí)行。
- 如果是main函數(shù),他可以將前面的int省略,return也是可以省略的。
- main(int argc,char *argv[])
-
include <stdio.h>是一個C語言標(biāo)準(zhǔn)輸出輸入庫。
注釋
- //代表單行注釋,
- /* code */代表多行注釋。
- /* 會與碰到的第一個//*/匹配
- //可以用來附加解釋的作用,或用來注釋代碼
- 寫清文件名,文件產(chǎn)權(quán),文件制作方,如果是某人,要寫清聯(lián)系方式。
printf:打印函數(shù)
- 打印""里面的語句
- \n是轉(zhuǎn)義字符代表換行
int main()
{
int a=6;
float b=9.8;
printf("a=%d,b=%f",a,b);
}
- %d:是占位符,輸出整數(shù)
- %c是占位符,輸出字符
- %f是占位符,輸出浮點數(shù)
- %lf是占位符,輸出double類型的數(shù)據(jù)
- printf("%m.nf");
- m<n+1+小數(shù)點前的個數(shù)時,無意義
代碼格式
main()
{
}
注意:每碰到一個{,就來個tab退格
常量
- 1,2,3,4:整形常量
- 'a','b','c':字符常量
- 1.2,2.3:浮點常量
- "hello world":字符串常量
- 0xfff321:地址常量
- 常量的特點:
- 常量不會改變
- 常量不能作為左值
- 0,const(只讀常量),define(宏常量)
變量
- 變量的特點
- 可以改變的量
- 可以作為左值,也可以作為右值
- 變量的定義
- 在shell腳本里:變量名=值
- 在C語言里十?dāng)?shù)據(jù)類型加變量名
- 同時定義多個同類型變量:數(shù)據(jù)類型 變量a,變量b;
- 數(shù)據(jù)類型
- 整形數(shù)據(jù)類型:int
- 字符型數(shù)據(jù)類型:char
- 浮點型:float(單精度),double雙精度()
- 數(shù)據(jù)類型的作用
- 標(biāo)志著后面的變量具體是接受什么類型的值
- 這個變量再內(nèi)存中占幾個字節(jié)
int:4 char:1 float:4//float是精確到 double:8//double是精確到
- 整形變量
- int value=1;
- int value;value=1;
- 字符變量
- char ch='c'
- char ch;ch='d'
- 浮點變量
- float f1=1.2
- float f2=1.4
- 變量的使用
- int value;value=8;
標(biāo)識符的規(guī)范
- 硬性規(guī)范:
- 不能用數(shù)字開頭
- 不能與C語言關(guān)鍵字相同
- 只能由字母下劃線和數(shù)字組成
- 建議規(guī)范
- 不能用拼音,多查字典
- 盡量使用駝峰命名法numOfStudent,num_of_student
- 見名知義
地址
- 內(nèi)存:字節(jié):Byte式計算機存儲的最小單位
- 1M=1024KB;1KB=1024Byte;1Byte=8bit
- 地址:地址是每一個字節(jié)所對應(yīng)的編號
- (中國===>家庭(屋子)===>門牌號)
- (計算機===>字節(jié)===>地址)
進(jìn)制
- 二進(jìn)制:0~1
- 八進(jìn)制:0~7
- 十進(jìn)制:0~9
- 十六進(jìn)制:
- 0~15:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f。
- 0X開頭
大端小端存儲法
- 小端法存儲:低位上的數(shù)存儲在低的地址所對應(yīng)的字節(jié)里。hston
- 大端法存儲:低位上的數(shù)存儲在高的地址所對應(yīng)的字節(jié)里。hntos
- 用處:用于網(wǎng)絡(luò)傳輸內(nèi)容的時候。
打印特殊字符
- 如何打印"":printf("\"abc\"\n");
- 如何打印'':printf("'abc'\n");
- 如何打印%:printf("%%");
- 如何打印\:printf("\\");
字符與ASCll碼
- 字符是一個特殊的整形,只占8位
- 記住的字符
int main()
{
char ch='a';
printf("ch=%d\n",ch);
//'2'+'2'=100='d'
}
'\0'=0
'0'=48
' '=32
'A'=65
'a'=97
- 全球停用編碼:unicode編碼
scanf(scan formatter:格式化輸入函數(shù))
- scanf("%d",&a);//&a:取a變量的地址
- scanf后面必須是取某個變量的地址
- 一個變量必須先定義出來再進(jìn)行scanf
- scanf("%d%d",&a,&b);
- scanf后面不要加\n。
getchar()與putchar()
int main()
{
char ch;
ch=getchar();
putchar(ch);
}
輸入字符可以直接輸出。
數(shù)據(jù)類型轉(zhuǎn)換
- 隱式轉(zhuǎn)換:精度小的====>精度大的
- char====>short int====>float====>double
- 強制類型轉(zhuǎn)換:(type)變量
int a=9;
int b=8;
float c=(float)a/b;//強制轉(zhuǎn)換的是a的值,而不是a,所以a還是int類型。
運算符
- 注意點:計算機只進(jìn)行相同類型數(shù)據(jù)的運算,最后計算出來的結(jié)果也與他們的數(shù)據(jù)類型相同。
float a=9;
int b=8;
float c=a/b;
printf("c=%f",c);//結(jié)果為1.125000
分析:通過隱式轉(zhuǎn)換,將b改為float類型,8.000000,然后計算結(jié)果。
- 算數(shù)運算符:+ - * / % ++
- %后面必須是整數(shù)
- ++
- 前綴++
int a=9; int b=++a;//a=a+1,b=a.- 后綴++
int a=9; int b=a++;//b=aa=a+1.- 前綴--
int a=9; int b=--a;//a=a-1,b=a.- 后綴--
int a=9; int b=a--;//b=a,a=a+1.
- 位運算符
- |:位或:有1為1
- &:位與:有0為0
- ^: 異或: 只要不同就為1
- ~: 取反:先得補碼再取反
a=3; ~a=-4; 3:0000 0011 對補碼取反:1111 1100(此時變?yōu)樨?fù)數(shù)) 反碼為:1111 1011 原碼為:0000 0100a=-3; ~a=2; -3:1000 0011 碼反:1111 1100 補碼為:1111 1101 取反:0000 0010 原碼:0000 0010 - 原碼,反碼,補碼
- 正數(shù)的原碼和反碼補碼相同
- 負(fù)數(shù)的反碼在原碼的基礎(chǔ)上符號位不變,后面依次取反。負(fù)數(shù)的補碼在反碼基礎(chǔ)上+1
問題:1+(-1)會得到結(jié)果-2 數(shù)據(jù)在內(nèi)存中是以數(shù)據(jù)的補碼存在 數(shù)據(jù)是以補碼存在,原碼輸出。 - 左移<<
a=3;
b=a<<2;//b=12
0000 0011
0000 1100
b=a>>2;//b=0
0000 0011
0000 0000
a=-3
b=a<<2;//b=-12
1000 0011
1111 1100
1111 1101
1111 0100
1111 0011
1000 1100
a=-3
b=a>>2;//b=-1
1000 0011
1111 1100
1111 1101
1111 1111
1111 1110
1000 0001
- ch的范圍
- -128~127
char ch=127;可以正常輸出 char ch=128;輸出為-128//1000 0000 默認(rèn)為-128 char ch=129;輸出為-127.
小結(jié):總的來說大部分知識都聽過,但是在最下面講的計算機都是以補碼的形式計算,原碼輸出,二進(jìn)制進(jìn)行存儲的。這一點以前雖然知道但沒細(xì)究,所以這次計算過了一次~運算突然發(fā)現(xiàn)自己以前計算的方式有點錯誤,以前3取反我算到1111 1100時根本沒想到會變成負(fù)數(shù),所以多了一步負(fù)數(shù)轉(zhuǎn)原碼的過程。總的來說,還是學(xué)到了新的知識。