1驶冒、運算符
取模運算符:%
增量運算符:++ 前綴,后綴
減量運算符:--
+=, -=, =, /=, %=
2相寇、類型轉(zhuǎn)換基本規(guī)則:
(1)當(dāng)出現(xiàn)在表達式里脏款,有符號和無符號的char 和 short 類型都將被自動轉(zhuǎn)換為int,在需要的情況下退盯,將自動被轉(zhuǎn)換為unsigned int
(2)在包含兩種數(shù)據(jù)類型的任何運算里彼乌,兩個值都被轉(zhuǎn)換稱兩種類型里較高的級別
(3)類型級別從高到低為:long double, double, float, unsigned long long, long long, unsigned long, long, unsigned int, int
(4)當(dāng)作為函數(shù)的參數(shù)被傳遞時,char 和 short 會被轉(zhuǎn)換為int渊迁,float會被轉(zhuǎn)換為double慰照,可以通過函數(shù)原型來阻止自動提升的發(fā)生
強制轉(zhuǎn)換類型:(type) 變量名
3、函數(shù)
返回值類型 函數(shù)名(參數(shù)列表) //沒有參數(shù)就用void 琉朽, 形參:函數(shù)里聲明的參數(shù)毒租,實參:傳遞給參數(shù)的值
{
statement;
}
4、關(guān)系運算符
<, <=, ==, >=, >, !=
5箱叁、for循環(huán)
for (count = 1; count <= NUMBER; count++)
{
statement;
}
可以使用逗號運算符在for循環(huán)中使用多個初始化或更新表達式
for (a = 1, b = 2; a < 100; a++, b++)
{
statement;
}
逗號運算符:從左到右執(zhí)行
6墅垮、do while循環(huán)
do
{
statement;
} while (boolean)
7、數(shù)組
type arrayName[size];
數(shù)組元素編號從0開始耕漱,直到size-1
char數(shù)組算色,并且存在的最后一個元素是 \0 ,則該數(shù)組是字符串
C90, c99:
int m = 3, n = 4;
int arr1[m], arr[n]; c90不允許螟够,c99允許
初始化:type arrayName[size] = {值列表};//當(dāng)數(shù)值數(shù)目少于數(shù)組元素數(shù)目時剃允,多余的數(shù)組元素被初始化為默認值
const type arrayName[size] = {值列表};//定義只讀數(shù)組
變量和數(shù)組元素未初始化的數(shù)值是不確定的
指定項目初始化:
int arr[6] = {[5] = 212};//C99 把arr[5]初始化為212
指定項目初始化注意事項:
int day[12] = {31, 28, [4] = 31, 30, 31, [1] = 29};
各元素的值: 0->31, 1->29, 2->0, 3->0, 4->31, 5->30, 6->31, 7->0, 8->0, 9->0, 10->0, 11->0
數(shù)組和指針:
arr[3]恒等于(arr + 3)
&arr[3]等于arr + 3
變長數(shù)組:
并不表示在創(chuàng)建數(shù)組后,可以修改其大小。變長數(shù)組的大小在創(chuàng)建后就是保持不變的斥废,“變”的意思是說其維大小可以用變量來指定
int sum2d(int rows, int cols, int ar[rows][cols]);
int sum2d(int, int, int ar[][]);//C99
8、if語句
if (expression)
{
statement;
}
if (expression)
{
statement;
}
else //else與最近的if配對
{
statement;
}
9给郊、getchar(), putchar();
char ch = getchar();//接收一個字符
putchar(ch);//輸出一個字符
10牡肉、ctype.h 系列字符函數(shù)
isalnum() 字母或數(shù)字
isalpha() 字母
isblank() 空白字符(空格、水平制表符淆九、換行)
iscntrl() 控制符
isdigit() 阿拉伯?dāng)?shù)字
isgraph() 除空格以外的字符
islower() 小寫字母
isprint() 可打印字符
ispunct() 標(biāo)點符號
isspace() 空白字符:空格统锤、換行、走紙炭庙、回車饲窿、垂直制表符、水平制表符
isuper() 大寫字母
isxdigit() 十六進制數(shù)字字符
tolower() 返回小寫字符
toupper() 返回大寫字符
14焕蹄、邏輯運算符
&&, ||, ! 具有短路性
#include <iso646.h> 后逾雄,可以使用 and, or, not
15、stdbool.h
提供bool腻脏,true鸦泳,false的定義,使用布爾類型時需要include
16永品、條件運算符
expression ? if-true-expression : if-false-expression;
17做鹰、循環(huán)輔助語句 continue, break
continue:
(1)忽略剩余代碼,進行下一次迭代
(2)位于嵌套結(jié)構(gòu)中鼎姐,忽略里層循環(huán)
break:
終止循環(huán)
18钾麸、switch語句
switch(expression)
{
case exp1:
statement;
break; //如果沒有break會往下執(zhí)行
default:
statement;
break;
}
19、goto語句
(1)定義標(biāo)簽
標(biāo)簽名:
(2)跳轉(zhuǎn)
goto 標(biāo)簽名;
20炕桨、緩沖分類
完全緩沖I/O, 行緩沖I/O
對于完全緩沖輸入來說饭尝,緩沖區(qū)滿時被清空(內(nèi)容被發(fā)送至其目的地),這種類型的緩沖通常出現(xiàn)在文件輸入中谋作,緩沖區(qū)的大小取決于系統(tǒng)芋肠,但512字節(jié)和4096字節(jié)是常見的值
對于行緩沖I/O來說,遇到一個換行字符時將被清空緩沖區(qū)遵蚜,鍵盤輸入是標(biāo)準(zhǔn)的行緩沖帖池,按下回車鍵將清空緩沖區(qū)
21、file_efo.c
#include <stdio.h>
#include <stdlib.h> //為了使用exit()
int main()
{
int ch;
FILE *fp;
char fname[50];
printf("Enter the name of the file:");
scanf("%s", fname);
fp = fopen(fname, "r");
if(fp == NULL)
{
printf("Failed to open file. Bye\n");
exit(1);
}
while((ch = getc(fp) != EOF)
{
putchar(ch);
}
fclose(fp);
return 0;
}
22吭净、函數(shù)
返回值類型 函數(shù)名(類型 參數(shù)名, 類型 參數(shù)名)
{
}
void fuc();//不會進行參數(shù)檢查
void fuc2(void);//表明該函數(shù)確實不使用參數(shù)睡汹,編譯器就會檢查確實有沒有使用參數(shù)
遞歸:
調(diào)用自己的函數(shù)稱為遞歸
遞歸函數(shù)必須在某一條件下返回確定的值,否則產(chǎn)生無限調(diào)用
對形參使用const修飾符寂殉,編譯器會把形參當(dāng)作常量來對待囚巴,無法修改
23、地址運算符 &
24、取值運算符 * 也叫間接運算符
聲明一個指針: 類型 * 指針名
指針可以作為函數(shù)的參數(shù)
取指針地址——指針變量同其他變量一樣具有地址和數(shù)值彤叉,使用運算符&可以的餓到存儲指針本身的地址
常量或非常量數(shù)據(jù)的地址賦給指向常量的指針是合法
只有非長臉該數(shù)據(jù)的指針才可以賦給普通的指針
const int * pc;//指向常量int類型的指針庶柿,指針可改,數(shù)據(jù)不可改
int * const pc2;//常量指針秽浇,指針不可改浮庐,數(shù)據(jù)可改
const int * const pc3;//指針不可改,常量不可改
定義指向多維數(shù)組的指針: int (* pz)[2];//pz指向一個包含2個int值的數(shù)組
指針之間的賦值規(guī)則比數(shù)值類型的賦值更加嚴格柬焕,類型不同就不行
25审残、復(fù)合文字
創(chuàng)建一個包含兩個int值的無名稱數(shù)組:
(int [2]) {10, 20}
(int []) {10, 20, 30}
26、字符串I/O
gets(字符串?dāng)?shù)組名):最后一個元素是\0,返回獲取的字符串的地址斑举,如果出錯或gets()遇到文件結(jié)尾搅轿,返回一個空地址
puts(字符串|字符串?dāng)?shù)組);
字符串?dāng)?shù)組初始化:
(1)char array1[size] = "this is a string.";
(2)char array2[size] = {'t', 'h', 'i', 's', 'i', 's', 'a', 's','\0'};//這種方式最后一個元素必須是\0,多余的數(shù)組會被初始化為\0
區(qū)別:
char heart[] = "I love";//不能用于++, --
char *head = "I like";//可用于++, --
主要區(qū)別在于數(shù)組名heart是個常量,而指針head則是個變量
head = heart;//合法
heart = head;//非法
fges()函數(shù):多用于文件讀取
(1)第二個參數(shù)來說明最大讀入字符數(shù),如果這個參數(shù)值為n,fgets()就會讀取最多n-1個字符或者讀完一個換行符為止
(2)如果fgets()讀取到換行符业舍,就會把它存到字符串里,而不是想gets()那樣丟棄它
(3)第三個參數(shù)來說明讀哪一個文件沸柔。使用stdin作為參數(shù),從鍵盤上讀數(shù)據(jù)
scanf(), gets():
scanf更基于獲取單詞而不是獲取字符串铲敛,gets函數(shù)會讀取所有的字符褐澎,直到遇到第一個換行符為止
puts(地址參數(shù)):參數(shù)是一個地址
顯示字符串時自動在其后添加一個換行符,直到遇到空白字符\0
fputs()函數(shù):多用于文件讀取
第二個參數(shù)說明要寫的文件伐蒋,使用stdout作為參數(shù)來進行輸出顯示
fputs()并不為輸出自動添加換行符
27工三、字符串函數(shù) string.h
strlen()函數(shù):返回字符串的長度
strcat()函數(shù):兩個參數(shù)為char * 類型,將第二個參數(shù)附加到第一個參數(shù)后面
strncat()函數(shù):三個參數(shù)先鱼,第三個指定第二個參數(shù)添加到第一個參數(shù)的長度俭正,當(dāng)加到足夠字符或遇到空字符時停止
strcmp()函數(shù):兩個字符串參數(shù),a1>a2返回1焙畔,a1=a2返回0掸读,a1<a2返回-1
strncmp(a1, a2, int)函數(shù):第三個參數(shù)指定a1, a2比較的字符串長度
strcpy(a1, a2)函數(shù):把a2的內(nèi)容復(fù)制到a1,要保證a1的控件足夠大容納宏多,返回第一個參數(shù)的字符的地址儿惫,第一個參數(shù)可以使數(shù)組中的中間的一部分
聲明一個數(shù)組將為數(shù)據(jù)分配存儲控件,而聲明一個指針只為一個地址分配存儲空間
strncpy(a1, a2, length):第三個函數(shù)指明最大可復(fù)制的字符數(shù)伸但,如果a2比length大肾请,則沒有添加空字符,因此需要設(shè)置n為目標(biāo)數(shù)組大小減1更胖,然后將最后一個數(shù)組元素賦值為'\0'
sprintf(存儲, 轉(zhuǎn)換說明字符, 項目列表)函數(shù):跟printf類似铛铁,將結(jié)果存儲到存儲地址里
常用:
char *strcpy(char * s1, const char * s2);
把s2指向的字符串(包括空字符)復(fù)制到s1指向的位置隔显,返回值是s1
char *strncpy(char * s1, const char * s2, size_t n);
把s2指向的字符復(fù)制到s1指向的位置,復(fù)制的字符數(shù)不超過n個饵逐,返回值是s1.空字符后的字符不被賦值括眠,如果原字符串的字符數(shù)少于n個,在字符串中就以空字符填充倍权。如果源字符串的字符數(shù)大于或等于n個哺窄,空字符就不被賦值,返回值是s1
char *strcat(char * s1, const char * s2);
s2指向的字符串被復(fù)制到s1指向字符串的結(jié)尾账锹,復(fù)制過來的s2所指字符串的第一個字符覆蓋了s1所指字符結(jié)尾的空字符,返回值是s1
char *strncat(char * s1, const char * s2, size_t n);
s2字符串中只有前n個字符被追加到s1字符串坷襟,復(fù)制過來的s2所指字符串的第一個字符覆蓋了s1所指字符結(jié)尾的空字符奸柬,s2字符穿中的空字符及其后的任何字符都不會被賦值,并且追加一個空字符到所得結(jié)果后面婴程,返回值是s1
int strcmp(const char * s1, const char * s2);
如果s1字符串在機器編碼順序中落后于s2字符廓奕,函數(shù)的返回值是一個整數(shù);如果兩個字符串相同档叔,返回值是0桌粉;如果第一個字符串在機器編碼順序中先于第二個字符串,返回值是一個負數(shù)
int strncmp(const char * s1, const char * s2, size_t n);
函數(shù)的作用和strcmp()一樣衙四,只是比較n個字符后或者遇到第一個空白字符時會停止比較铃肯,由二者中最先被滿足的那一個條件終止比較過程
char * strpbrk(const char * s1, const char * s2);
返回一個指針,指向字符串s1中存放s2字符中的任何字符的第一個位置传蹈,如果沒有找到任何字符押逼,返回空指針
char *strrchr(const char * s, int c)
返回一個指針,指向字符串s中字符c最后一次出現(xiàn)的地方(標(biāo)志結(jié)束的空字符是字符串的一部分惦界,因此也可以搜索到它)挑格,如果沒找到該字符,函數(shù)就返回空指針
char *strstr(const char * s1, const char * s2)
返回一個指針沾歪,指向s1字符串中第一次出現(xiàn)s2字符串的地方漂彤,如果在s1中沒找到s2字符串,函數(shù)就返回空指針
size_t strlen(const char * s)
返回s字符串中的字符個數(shù)灾搏,其中布包裹標(biāo)志結(jié)束的空字符
char *strcpy(char * s1, const char * s2)