1、運算符
取模運算符:%
增量運算符:++ 前綴,后綴
減量運算符:--
+=, -=, =, /=, %=
2、類型轉換基本規則:
(1)當出現在表達式里,有符號和無符號的char 和 short 類型都將被自動轉換為int,在需要的情況下,將自動被轉換為unsigned int
(2)在包含兩種數據類型的任何運算里,兩個值都被轉換稱兩種類型里較高的級別
(3)類型級別從高到低為:long double, double, float, unsigned long long, long long, unsigned long, long, unsigned int, int
(4)當作為函數的參數被傳遞時,char 和 short 會被轉換為int,float會被轉換為double,可以通過函數原型來阻止自動提升的發生
強制轉換類型:(type) 變量名
3、函數
返回值類型 函數名(參數列表) //沒有參數就用void , 形參:函數里聲明的參數,實參:傳遞給參數的值
{
statement;
}
4、關系運算符
<, <=, ==, >=, >, !=
5、for循環
for (count = 1; count <= NUMBER; count++)
{
statement;
}
可以使用逗號運算符在for循環中使用多個初始化或更新表達式
for (a = 1, b = 2; a < 100; a++, b++)
{
statement;
}
逗號運算符:從左到右執行
6、do while循環
do
{
statement;
} while (boolean)
7、數組
type arrayName[size];
數組元素編號從0開始,直到size-1
char數組,并且存在的最后一個元素是 \0 ,則該數組是字符串
C90, c99:
int m = 3, n = 4;
int arr1[m], arr[n]; c90不允許,c99允許
初始化:type arrayName[size] = {值列表};//當數值數目少于數組元素數目時,多余的數組元素被初始化為默認值
const type arrayName[size] = {值列表};//定義只讀數組
變量和數組元素未初始化的數值是不確定的
指定項目初始化:
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
數組和指針:
arr[3]恒等于(arr + 3)
&arr[3]等于arr + 3
變長數組:
并不表示在創建數組后,可以修改其大小。變長數組的大小在創建后就是保持不變的,“變”的意思是說其維大小可以用變量來指定
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 系列字符函數
isalnum() 字母或數字
isalpha() 字母
isblank() 空白字符(空格、水平制表符、換行)
iscntrl() 控制符
isdigit() 阿拉伯數字
isgraph() 除空格以外的字符
islower() 小寫字母
isprint() 可打印字符
ispunct() 標點符號
isspace() 空白字符:空格、換行、走紙、回車、垂直制表符、水平制表符
isuper() 大寫字母
isxdigit() 十六進制數字字符
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、循環輔助語句 continue, break
continue:
(1)忽略剩余代碼,進行下一次迭代
(2)位于嵌套結構中,忽略里層循環
break:
終止循環
18、switch語句
switch(expression)
{
case exp1:
statement;
break; //如果沒有break會往下執行
default:
statement;
break;
}
19、goto語句
(1)定義標簽
標簽名:
(2)跳轉
goto 標簽名;
20、緩沖分類
完全緩沖I/O, 行緩沖I/O
對于完全緩沖輸入來說,緩沖區滿時被清空(內容被發送至其目的地),這種類型的緩沖通常出現在文件輸入中,緩沖區的大小取決于系統,但512字節和4096字節是常見的值
對于行緩沖I/O來說,遇到一個換行字符時將被清空緩沖區,鍵盤輸入是標準的行緩沖,按下回車鍵將清空緩沖區
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、函數
返回值類型 函數名(類型 參數名, 類型 參數名)
{
}
void fuc();//不會進行參數檢查
void fuc2(void);//表明該函數確實不使用參數,編譯器就會檢查確實有沒有使用參數
遞歸:
調用自己的函數稱為遞歸
遞歸函數必須在某一條件下返回確定的值,否則產生無限調用
對形參使用const修飾符,編譯器會把形參當作常量來對待,無法修改
23、地址運算符 &
24、取值運算符 * 也叫間接運算符
聲明一個指針: 類型 * 指針名
指針可以作為函數的參數
取指針地址——指針變量同其他變量一樣具有地址和數值,使用運算符&可以的餓到存儲指針本身的地址
常量或非常量數據的地址賦給指向常量的指針是合法
只有非長臉該數據的指針才可以賦給普通的指針
const int * pc;//指向常量int類型的指針,指針可改,數據不可改
int * const pc2;//常量指針,指針不可改,數據可改
const int * const pc3;//指針不可改,常量不可改
定義指向多維數組的指針: int (* pz)[2];//pz指向一個包含2個int值的數組
指針之間的賦值規則比數值類型的賦值更加嚴格,類型不同就不行
25、復合文字
創建一個包含兩個int值的無名稱數組:
(int [2]) {10, 20}
(int []) {10, 20, 30}
26、字符串I/O
gets(字符串數組名):最后一個元素是\0,返回獲取的字符串的地址,如果出錯或gets()遇到文件結尾,返回一個空地址
puts(字符串|字符串數組);
字符串數組初始化:
(1)char array1[size] = "this is a string.";
(2)char array2[size] = {'t', 'h', 'i', 's', 'i', 's', 'a', 's','\0'};//這種方式最后一個元素必須是\0,多余的數組會被初始化為\0
區別:
char heart[] = "I love";//不能用于++, --
char *head = "I like";//可用于++, --
主要區別在于數組名heart是個常量,而指針head則是個變量
head = heart;//合法
heart = head;//非法
fges()函數:多用于文件讀取
(1)第二個參數來說明最大讀入字符數,如果這個參數值為n,fgets()就會讀取最多n-1個字符或者讀完一個換行符為止
(2)如果fgets()讀取到換行符,就會把它存到字符串里,而不是想gets()那樣丟棄它
(3)第三個參數來說明讀哪一個文件。使用stdin作為參數,從鍵盤上讀數據
scanf(), gets():
scanf更基于獲取單詞而不是獲取字符串,gets函數會讀取所有的字符,直到遇到第一個換行符為止
puts(地址參數):參數是一個地址
顯示字符串時自動在其后添加一個換行符,直到遇到空白字符\0
fputs()函數:多用于文件讀取
第二個參數說明要寫的文件,使用stdout作為參數來進行輸出顯示
fputs()并不為輸出自動添加換行符
27、字符串函數 string.h
strlen()函數:返回字符串的長度
strcat()函數:兩個參數為char * 類型,將第二個參數附加到第一個參數后面
strncat()函數:三個參數,第三個指定第二個參數添加到第一個參數的長度,當加到足夠字符或遇到空字符時停止
strcmp()函數:兩個字符串參數,a1>a2返回1,a1=a2返回0,a1<a2返回-1
strncmp(a1, a2, int)函數:第三個參數指定a1, a2比較的字符串長度
strcpy(a1, a2)函數:把a2的內容復制到a1,要保證a1的控件足夠大容納,返回第一個參數的字符的地址,第一個參數可以使數組中的中間的一部分
聲明一個數組將為數據分配存儲控件,而聲明一個指針只為一個地址分配存儲空間
strncpy(a1, a2, length):第三個函數指明最大可復制的字符數,如果a2比length大,則沒有添加空字符,因此需要設置n為目標數組大小減1,然后將最后一個數組元素賦值為'\0'
sprintf(存儲, 轉換說明字符, 項目列表)函數:跟printf類似,將結果存儲到存儲地址里
常用:
char *strcpy(char * s1, const char * s2);
把s2指向的字符串(包括空字符)復制到s1指向的位置,返回值是s1
char *strncpy(char * s1, const char * s2, size_t n);
把s2指向的字符復制到s1指向的位置,復制的字符數不超過n個,返回值是s1.空字符后的字符不被賦值,如果原字符串的字符數少于n個,在字符串中就以空字符填充。如果源字符串的字符數大于或等于n個,空字符就不被賦值,返回值是s1
char *strcat(char * s1, const char * s2);
s2指向的字符串被復制到s1指向字符串的結尾,復制過來的s2所指字符串的第一個字符覆蓋了s1所指字符結尾的空字符,返回值是s1
char *strncat(char * s1, const char * s2, size_t n);
s2字符串中只有前n個字符被追加到s1字符串,復制過來的s2所指字符串的第一個字符覆蓋了s1所指字符結尾的空字符,s2字符穿中的空字符及其后的任何字符都不會被賦值,并且追加一個空字符到所得結果后面,返回值是s1
int strcmp(const char * s1, const char * s2);
如果s1字符串在機器編碼順序中落后于s2字符,函數的返回值是一個整數;如果兩個字符串相同,返回值是0;如果第一個字符串在機器編碼順序中先于第二個字符串,返回值是一個負數
int strncmp(const char * s1, const char * s2, size_t n);
函數的作用和strcmp()一樣,只是比較n個字符后或者遇到第一個空白字符時會停止比較,由二者中最先被滿足的那一個條件終止比較過程
char * strpbrk(const char * s1, const char * s2);
返回一個指針,指向字符串s1中存放s2字符中的任何字符的第一個位置,如果沒有找到任何字符,返回空指針
char *strrchr(const char * s, int c)
返回一個指針,指向字符串s中字符c最后一次出現的地方(標志結束的空字符是字符串的一部分,因此也可以搜索到它),如果沒找到該字符,函數就返回空指針
char *strstr(const char * s1, const char * s2)
返回一個指針,指向s1字符串中第一次出現s2字符串的地方,如果在s1中沒找到s2字符串,函數就返回空指針
size_t strlen(const char * s)
返回s字符串中的字符個數,其中布包裹標志結束的空字符
char *strcpy(char * s1, const char * s2)