第八~十三章
第八章
-
考慮下面的數(shù)組聲明:
int a[] = {4, 9, 1, 8, [0]=5, 7};編譯器在處理初始化式列表時(shí),會(huì)記錄下一個(gè)待初始化的數(shù)組元素位置。正常情況下,下一個(gè)元素是剛被初始化元素后面的那個(gè)。但是當(dāng)列表中出現(xiàn)初始化式時(shí),下一個(gè)元素會(huì)被強(qiáng)制為指示符對(duì)應(yīng)的元素,即使該元素已經(jīng)被初始化過(guò)了。
所以最終效果與下面的聲明一樣:
int a[] = {5, 7, 1, 8};
第九章
- 函數(shù)定義
- 如果省略返回類型,C89假定為
int類型,在C99中是非法的。
- 如果省略返回類型,C89假定為
- 函數(shù)聲明
- 函數(shù)聲明可以放在另一個(gè)函數(shù)體內(nèi)
- C99中在調(diào)用一個(gè)函數(shù)之前,必須先對(duì)其進(jìn)行聲明或定義
- 變長(zhǎng)數(shù)組的形參
-
一維
int sum_array(int a[], int n); int sum_array(int n, int a[n]); int sum_array(int n, int a[*]); int sum_array(int, int [*]); int sum_array(int, int []); int sum_array(int n, int a[]); -
二維
int sum_two_dimensional_array(int n, int m, int a[n][m]); int sum_two_dimensional_array(int n, int m, int a[*][*]); int sum_two_dimensional_array(int n, int m, int a[][m]); int sum_two_dimensional_array(int n, int m, int a[][*]);
-
- 數(shù)組參數(shù)聲明中使用
static-
下例中,將
static放在數(shù)字3之前表明數(shù)組長(zhǎng)度至少可以保證是3int sum_array(int a[static 3], int n) 如果數(shù)組是多維的,
static僅可用于第一維
-
- 復(fù)合字面量
- 復(fù)合字面量是通過(guò)指定其包含的元素而創(chuàng)建的沒(méi)有名字的數(shù)組
- 格式:先在一堆圓括號(hào)內(nèi)給定類型名,隨后在一對(duì)花括號(hào)內(nèi)設(shè)定所包含元素的值
第十二章
| 表達(dá)式 | 含義 |
|---|---|
*p++或*(p++)
|
自增前表達(dá)式值是*p,以后再自增p
|
(*p)++ |
自增前表達(dá)式值是*p,以后再自增p
|
*++p或*(++p)
|
先自增p,自增后表達(dá)式的值是*p
|
++*p或++(*p)
|
先自增*p,自增后表達(dá)式的值是*p
|
第十三章
-
strlen的精簡(jiǎn)史size_t strlen(const char *s) { size_t n; for (n = 0; *s != '\0'; s++) { n++; } return n; }把
n的初始化移到聲明,*s != '\0'和*s != 0是一樣的,測(cè)試*s != 0與*s是一樣的size_t strlen(const char *s) { size_t n = 0; for (; *s; s++) { n++; } return n; }同一個(gè)表達(dá)式中對(duì)
s進(jìn)行自增,并測(cè)試*s是可行的size_t strlen(const char *s) { size_t n = 0; for (; *s++;) { n++; } return n; }用
while語(yǔ)句替換for語(yǔ)句size_t strlen(const char *s) { size_t n = 0; while (*s++) { n++; } return n; }看起來(lái)精簡(jiǎn)很多,但事實(shí)上速度根本沒(méi)提升,至少對(duì)于一些編譯器下面的版本確實(shí)會(huì)快一點(diǎn)
size_t strlen(const char *s) { const char *p = s; while (*s++) ; return s - p; }速度的提升得益于不需要在
while循環(huán)中對(duì)n進(jìn)行自增 -
搜索字符串結(jié)尾
while (*s++) ;while (*s) *s++;注意兩個(gè)版本結(jié)束時(shí)
s指向的位置 -
字符串復(fù)制
while (*s++ = *p++) ;循環(huán)在賦值空字符后停止,不需要單獨(dú)添加空字符
C89規(guī)定,編譯器必須最少支持509個(gè)字符長(zhǎng)的字符串字面量(沒(méi)錯(cuò),就是509,不要懷疑);C99是4095個(gè)字符