C語言基礎(chǔ)
編譯程序
- gcc xx.c,他會(huì)默認(rèn)生成a.out的可執(zhí)行文件,在a.out所在目錄,執(zhí)行./a.out
- gcc xx.c -o xx,生成一個(gè)xx可執(zhí)行文件,注意不要命名成xx.c,這樣會(huì)覆蓋原先xx.c文件內(nèi)容
- gcc xx.c -o xx -g -Wall的意思是開啟所有的語法警告
- gcc之檢查語法錯(cuò)誤
- 每次修改完,c程序都必須要執(zhí)行一次gcc
- /如果覺得gcc太麻煩,寫一個(gè)shell腳本/
hell world程序
int main()
{
return 0;
}
- 可執(zhí)行程序一執(zhí)行菱农,就會(huì)找一個(gè)叫做main的函數(shù)然后運(yùn)行main大括號(hào)里面的語句
- 一個(gè).c文件有且只能有一個(gè)main的函數(shù)
- 如果一個(gè)函數(shù)碰到return這個(gè)單詞就代表這個(gè)函數(shù)運(yùn)行結(jié)束.return后面的語句將永遠(yuǎn)不會(huì)被執(zhí)行.
- 如果是main函數(shù),他可將前面int省略.return也是可以省略的.
- main(int argc,char *argv[])
include<stdio.h>是一個(gè)C語言標(biāo)準(zhǔn)輸入輸出庫(kù).
注釋
- //代表單行注釋
- /* code/注釋多行:注意:/ * /*/ 第一個(gè)/ *會(huì)遇到第一個(gè) * /匹配
注釋使用情況
- 注釋代碼
- 解釋代碼
- 寫清楚文件名,文件產(chǎn)權(quán)copyright,文件制作者,如果是某人:要寫清聯(lián)系方式
printf
- 打印函數(shù):打印雙引號(hào)""里面的語句,\n:轉(zhuǎn)義字符,代表?yè)Q行
代碼格式
main()
{
}
- 注意:每碰到一個(gè){,就要換行,再來一個(gè)tab鍵.
常量
- 1,2,3,4:整型常量
- 'a','b','c','d':字符常量
- 1.2,2.2:浮點(diǎn)常量
- "hello world":字符串常量
- 0xff1:地址常量
常量的特性
- 常量不會(huì)改變
- 常量不能作為左值
- 8,const(只讀常量),define(宏常量)
變量
變量的特點(diǎn)
- 可以改變的量
- 可以作為左值,也可以作為右值
變量的定義
- 在shell腳本里:變量名=值
- 在C語言里面:數(shù)據(jù)類型+變量名;
- 同時(shí)定義多個(gè)同種類型的變量;數(shù)據(jù)類型 變量1,變量2;
數(shù)據(jù)類型
- 整型數(shù)據(jù)類型:int
- 字符數(shù)類型:char
- 浮點(diǎn)類型:float(單精度),double(雙精度)
- float類型的變量精確到7位
數(shù)據(jù)類型的作用
- 標(biāo)志著后面的變量具體是接收什么類型的值
- 這個(gè)變量在內(nèi)存中占幾個(gè)字節(jié)
- int:4
- char:1
- float:4
- double:8
整型變量
- int value=8;
- int value;value=8;
字符變量
- char ch='c';
- char ch;ch='d';
浮點(diǎn)變量
- float f1=1.2;
- float f1;f1=1.2;
變量的使用
- int value;value=8;
標(biāo)識(shí)符的命名規(guī)范
硬性規(guī)范
- 不能用數(shù)字開頭
- 只能由字母,下劃線好數(shù)字組成
- 不能與C語言關(guān)鍵字相同
建議規(guī)范
- 不能用拼音,多查字典
- 盡量使用駝峰命名法:numOfStudent,或者num_of_student
- 見名知義
printf具體用法
int a=6;
float=9.8;
printf("a=%d,b=%f\n",a,b);
- %m.nf
- m<=n+1+整數(shù)實(shí)際部位的位數(shù),m無效
- m>n+1+整數(shù)實(shí)際部分的位數(shù),m有效,左邊以空格補(bǔ)全
地址
- 內(nèi)存:字節(jié):Byte是計(jì)算機(jī)存儲(chǔ)的最小單位.
- 1M=1024KB,1KB=1024Byte纸淮,1Byte=8bit
- 位:bit:一個(gè)字節(jié)占八位
- 地址:是每一個(gè)字節(jié)所對(duì)應(yīng)的編號(hào)
進(jìn)制
- 二進(jìn)制:0~1:以0B,0b開頭
- 八進(jìn)制:0~7:以0開頭:
- 十進(jìn)制:0~9
- 十六進(jìn)制:0~ f,或者0~F:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f:0x開頭
大端小端存儲(chǔ)法
小端法
- 低位上的數(shù)存儲(chǔ)在低的地址所對(duì)應(yīng)的字節(jié)
大端法
- 低位上的數(shù)存儲(chǔ)在高的地址所對(duì)應(yīng)的字節(jié)
- 用處:一般網(wǎng)絡(luò)傳輸內(nèi)的時(shí)候
打印特殊字符
- ":\ " printf(""shangqian"\n");
- ':' '或'printf("'shangqian'\n");
- %:%% printf("%%%d\n",a);
- \ :\ \ printf("%d\ \n",a);
字符與ASCII編碼
- 字符是一個(gè)特殊的整型,占8位
- '\0'=0,' '=32,'0'=48 'A'=65 'a'=97
- 全球unicode
scanf
- 基本用法
#include "stdio.h"
int main()
{
int a呐舔;
scanf("%d",&a);
printf("a=%d\n",a);
returnn 0;
}
- 注意點(diǎn) scanf,后面必須是取變的地址
- 一個(gè)變量必須先定義出來再進(jìn)scanf
- 不要在scanf里多弄花樣潜索。
- 同時(shí)輸入多個(gè)變量
scanf("%d%d",&a,&b);
- %d,%f,%c,%lf.%lf是輸入double類型的數(shù)據(jù)
getchar()和putchar()
char ch;
ch=getchar();
putchar(ch);
putchar('\n');
//printf("ch=%c\n",ch);
數(shù)據(jù)類型轉(zhuǎn)換
- 隱式轉(zhuǎn)換:精度小的===>精度大的
char===>short int===>int===>float===>double- 強(qiáng)制類型轉(zhuǎn)換: (數(shù)據(jù)類型)變量/常量
int a=9;
int b=8;
float c=(float)a/b;
printf("c=%f\n",c);
運(yùn)算符
- 注意點(diǎn):計(jì)算機(jī)只進(jìn)行相同類型數(shù)據(jù)運(yùn)算,最后算出來的結(jié)果也與他們相同的數(shù)據(jù)類型
2.隱式轉(zhuǎn)換:精度小的===>精度大的
char===>short int===>int===>float===>double
算數(shù)運(yùn)算符
+ - * / % ++
- %:%左右兩邊的數(shù)都是整數(shù)
- 后綴++ 前綴++ 前綴-- 后綴--
位運(yùn)算符
1.|:
3:0011
5:0101
|:為0111 為7
- &:
3:0011
5:0101
&:0001 為1
- ^:
3:0011
5:0101
^ 0110 為6
- ~:按位取反
3:0011
~:1100 為-4
- +7
- 原碼:0000 0111
- 反碼:0000 0111
- 補(bǔ)碼:0000 0111
- -7
- 原碼:1000 0111
- 反碼:1111 1000
- 補(bǔ)碼:1111 1001
- 數(shù)據(jù)在內(nèi)存中是以數(shù)據(jù)的補(bǔ)碼形式存在.
- 正數(shù)取反
- +7
- 原碼: 0000 0000 0000 0000 0000 0000 0000 0111
- 反碼:0000 0000 0000 0000 0000 0000 0000 0111
- 補(bǔ)碼:0000 0000 0000 0000 0000 0000 0000 0111
- 取反補(bǔ)碼:1111 1111 1111 1111 1111 1111 1111 1000
- 反碼為:1111 1111 1111 1111 1111 1111 1111 0111
- 原碼為:1000 0000 0000 0000 0000 0000 1000
- +7取反為-8
2.-7- 原碼: 1000 0000 0000 0000 0000 0000 0000 0111
- 反碼:1111 1111 1111 1111 1111 1111 1111 1000
- 補(bǔ)碼:1111 1111 1111 1111 1111 1111 1111 1001
- 取反補(bǔ)碼為:000 0000 0000 0000 0000 0000 0110
- 反碼:000 0000 0000 0000 0000 0000 0110
- 補(bǔ)碼:000 0000 0000 0000 0000 0000 0110
- 結(jié)果:-7取反為+6
左移
正數(shù)左移
- 3左移兩位
- 原碼:0000 0011
- 反碼:0000 0011
- 補(bǔ)碼:0000 0011
- 左移兩位補(bǔ)碼為:0000 1100
- 反碼為:0000 1100
- 原碼為:0000 1100
- 結(jié)果為12
正數(shù)右移
- 3右移兩位
- 原碼為0000 0011
- 反碼:0000 0011
- 補(bǔ)碼:0000 0011
- 右移兩位補(bǔ)碼為:0000 0000
負(fù)數(shù)左移
- -3左移兩位
- 原碼:1000 0011
- 反碼:1111 1100
- 補(bǔ)碼:1111 1101
- 左移兩位補(bǔ)碼為:1111 0100
- 反碼為:1111 0011
- 原碼為:1000 1100
- 結(jié)果為-12
負(fù)數(shù)右移:以符號(hào)位補(bǔ)全
- -3右移兩位
- 原碼:1000 0011
- 反碼:1111 1100
- 補(bǔ)碼:1111 1101
- 右移兩位補(bǔ)碼為:1111 1111
- 反碼為:1111 1110
- 原碼為:1000 0001
- 結(jié)果為-1
- -6右移兩位
- 原碼:1000 0110
- 反碼:1111 1001
- 補(bǔ)碼:1111 1010
- 右移兩位補(bǔ)碼為:1111 1110
- 反碼為:1111 1101
- 原碼為:1000 0010
- 結(jié)果為-2
char:占1個(gè)字節(jié)
- 表示范圍為-128~127
char ch=128;
printf("ch=%d\n",ch);
- 結(jié)果為-128
char ch=129;
printf("ch=%d\n",ch);
- 結(jié)果為-127
unsigned char
unsigend char a=-1;
printf("a=%d\n",a);
- 結(jié)果為:a=255;
- -1的原碼:1000 0001
- -1的反碼:1111 1110
- -1的補(bǔ)碼:1111 1111
- 由于unsigne char 是無符號(hào)數(shù),所以不用再回原碼,直接取補(bǔ)碼;
賦值運(yùn)算符
num+=i==>num=num+i;
num>>=2==num=num>>2;
計(jì)算數(shù)據(jù)類型所占字節(jié)長(zhǎng)度
- printf中%p是打印地址
- printf("int所占字節(jié)長(zhǎng)度=%ld\n",sizeof((num)));
關(guān)系運(yùn)算符
- <, >, >= , <= ,!= , ==
- 在計(jì)算當(dāng)中,關(guān)系運(yùn)算符構(gòu)成的運(yùn)算,我們可以看成一個(gè)事件,如果這個(gè)事件成立,其結(jié)果(邏輯結(jié)果[0/1])1,如果事件不成立,其結(jié)果為0;
邏輯運(yùn)算符
- 事件1&&事件2:并且,事件1成立并且事件2也成立,整個(gè)邏輯結(jié)果才為1;否則,整個(gè)邏輯結(jié)果為0;
- 事件1||事件2:或者,事件1成立或者事件2也成立,整個(gè)邏輯結(jié)果才為1;否則,整個(gè)邏輯結(jié)果為0;
- !事件:非,如果事件成立,邏輯結(jié)果為1,!1,整個(gè)結(jié)果為0;否則,邏輯結(jié)果為1.
- 進(jìn)階:事件1&&事件2:如果事件1不成立,就不會(huì)執(zhí)行&&后面的運(yùn)算.
- 事件1||事件2:如果事件1成立,就不會(huì)執(zhí)行||后面的運(yùn)算.
- 5>3&&8<4-!0 >1.
5>3為1,!0為1,4-!0=3,8<3=0,1&&0=0;