C語言牽涉的概念比較復(fù)雜,規(guī)范繁多,使用靈活,容易出錯(cuò),不少初學(xué)者感到困難,下面通過幾個(gè)實(shí)例的分析來說明c語言學(xué)習(xí)中容易混淆的幾個(gè)問題,以期拋磚引玉,對(duì)初學(xué)者有所幫助。
問題1:下面的程序
int a=3,b=4;
char str=’c’;
printf(“%d,%d”,a,b,str);
執(zhí)行后, 輸出結(jié)果為:
(A)3,4,c (B)3 4 c
(C)3,4 (D)程序出錯(cuò)
分析:在格式輸出時(shí)一般要求格式說明符與輸出項(xiàng)相一致,當(dāng)輸出項(xiàng)多余格式說明符時(shí)多余的輸出項(xiàng)不輸出,所以答案為C。
問題2:有下面的程序段
char a[3],b[]=“china”;
a=b;
printf(“%s”,a);
則輸出結(jié)果為:
(A)運(yùn)行后輸出china (B)運(yùn)行后輸出ch (C) 運(yùn)行后輸出chi (D)編譯出錯(cuò)
分析:這個(gè)題容易錯(cuò)選a實(shí)際答案為d,由于定義了字符數(shù)組后,數(shù)組名作為數(shù)組的首地址,是一個(gè)常量,給一個(gè)常量賦值的語句是錯(cuò)誤的,換句話說,不能用賦值語句將一個(gè)字符常量或字符數(shù)組直接賦值給一個(gè)字符數(shù)組,以答案選D。
問題3:下列說明不正確的是:
(A)char a[10]=“china” (B)char a[10],p=a;p=“china” (C)char p;p=“china”(D)char a[10],p;p=a=“china”;
分析:此題易知A是正確的,D是錯(cuò)誤的,對(duì)于B、C就很難選擇了。有人認(rèn)為p是一個(gè)字符變量,以為把”china”賦給該字符變量是不對(duì)的,實(shí)際上它是一個(gè)指針變量,只能指向一個(gè)字符變量或其他字符類型數(shù)據(jù),不是把”china”存放到p中(指針變量只存放地址),只是把 “china”的首地址賦給指針變量 p,所以B,C也是正確的。
問題4:下面的程序執(zhí)行結(jié)果是:
main()
{int x[5]={2,4,6,8,10},ppp;
p=x;
pp=&&p;
printf(“%d”,(p++));
printf(“%d\n”,pp);
}
(A)4 4 (B)2 4
(C)2 2 (D)4 6
分析:在此題中p++是后加方式,先輸出p的值,p再自加,pp是二級(jí)指針,指向一級(jí)指針p,執(zhí)行第一條輸出語句前后,存在下列指向關(guān)系:
所以本題應(yīng)選b
問題5:下列輸出語句執(zhí)行后結(jié)果為:
int i=3;
printf(“%d”,-i++);
(A)3 (B)4
(C)-3 (D)-4
分析:此題考查運(yùn)算符的優(yōu)先級(jí),負(fù)號(hào)運(yùn)算符和++運(yùn)算符同優(yōu)先級(jí),而結(jié)合方向?yàn)椤白宰笾劣摇?,即-i++相當(dāng)于-i++ ,所以先取出i的值3,輸出-i的值-3,然后i增值為4,而不是i先增值為4,然后輸出-4,所以答案選擇C。
問題6:設(shè)有以下語句,
struct st
{int n;
struct st next;
};
static struct st a[3]={5,&&a[1],7,&&a[2],9,’\0’},p;
則以下表達(dá)式的值為6的是:
(A)p++→n (B)p→n++
(C)(p).n++ (D)++p→n
分析:此題也是考查運(yùn)算符的優(yōu)先級(jí),→優(yōu)先級(jí)高于++,結(jié)合方向?yàn)樽宰笾劣?,而后者結(jié)合方向?yàn)樽杂抑磷?,A答案相當(dāng)于p++ →n
B答案相當(dāng)于p→n?。熕訟、B、C表達(dá)式值均為5,D答案相當(dāng)于++p→n 自加方式為前加方式,所以其值為6。
上面是我在教學(xué)過程中學(xué)生一些比較集中的問題,只要認(rèn)真的體會(huì)和總結(jié),加強(qiáng)上機(jī)實(shí)踐,對(duì)自己C語言的學(xué)習(xí)會(huì)大有裨益。
問題1:下面的程序
int a=3,b=4;
char str=’c’;
printf(“%d,%d”,a,b,str);
執(zhí)行后, 輸出結(jié)果為:
(A)3,4,c (B)3 4 c
(C)3,4 (D)程序出錯(cuò)
分析:在格式輸出時(shí)一般要求格式說明符與輸出項(xiàng)相一致,當(dāng)輸出項(xiàng)多余格式說明符時(shí)多余的輸出項(xiàng)不輸出,所以答案為C。
問題2:有下面的程序段
char a[3],b[]=“china”;
a=b;
printf(“%s”,a);
則輸出結(jié)果為:
(A)運(yùn)行后輸出china (B)運(yùn)行后輸出ch (C) 運(yùn)行后輸出chi (D)編譯出錯(cuò)
分析:這個(gè)題容易錯(cuò)選a實(shí)際答案為d,由于定義了字符數(shù)組后,數(shù)組名作為數(shù)組的首地址,是一個(gè)常量,給一個(gè)常量賦值的語句是錯(cuò)誤的,換句話說,不能用賦值語句將一個(gè)字符常量或字符數(shù)組直接賦值給一個(gè)字符數(shù)組,以答案選D。
問題3:下列說明不正確的是:
(A)char a[10]=“china” (B)char a[10],p=a;p=“china” (C)char p;p=“china”(D)char a[10],p;p=a=“china”;
分析:此題易知A是正確的,D是錯(cuò)誤的,對(duì)于B、C就很難選擇了。有人認(rèn)為p是一個(gè)字符變量,以為把”china”賦給該字符變量是不對(duì)的,實(shí)際上它是一個(gè)指針變量,只能指向一個(gè)字符變量或其他字符類型數(shù)據(jù),不是把”china”存放到p中(指針變量只存放地址),只是把 “china”的首地址賦給指針變量 p,所以B,C也是正確的。
問題4:下面的程序執(zhí)行結(jié)果是:
main()
{int x[5]={2,4,6,8,10},ppp;
p=x;
pp=&&p;
printf(“%d”,(p++));
printf(“%d\n”,pp);
}
(A)4 4 (B)2 4
(C)2 2 (D)4 6
分析:在此題中p++是后加方式,先輸出p的值,p再自加,pp是二級(jí)指針,指向一級(jí)指針p,執(zhí)行第一條輸出語句前后,存在下列指向關(guān)系:
所以本題應(yīng)選b
問題5:下列輸出語句執(zhí)行后結(jié)果為:
int i=3;
printf(“%d”,-i++);
(A)3 (B)4
(C)-3 (D)-4
分析:此題考查運(yùn)算符的優(yōu)先級(jí),負(fù)號(hào)運(yùn)算符和++運(yùn)算符同優(yōu)先級(jí),而結(jié)合方向?yàn)椤白宰笾劣摇?,即-i++相當(dāng)于-i++ ,所以先取出i的值3,輸出-i的值-3,然后i增值為4,而不是i先增值為4,然后輸出-4,所以答案選擇C。
問題6:設(shè)有以下語句,
struct st
{int n;
struct st next;
};
static struct st a[3]={5,&&a[1],7,&&a[2],9,’\0’},p;
則以下表達(dá)式的值為6的是:
(A)p++→n (B)p→n++
(C)(p).n++ (D)++p→n
分析:此題也是考查運(yùn)算符的優(yōu)先級(jí),→優(yōu)先級(jí)高于++,結(jié)合方向?yàn)樽宰笾劣?,而后者結(jié)合方向?yàn)樽杂抑磷?,A答案相當(dāng)于p++ →n
B答案相當(dāng)于p→n?。熕訟、B、C表達(dá)式值均為5,D答案相當(dāng)于++p→n 自加方式為前加方式,所以其值為6。
上面是我在教學(xué)過程中學(xué)生一些比較集中的問題,只要認(rèn)真的體會(huì)和總結(jié),加強(qiáng)上機(jī)實(shí)踐,對(duì)自己C語言的學(xué)習(xí)會(huì)大有裨益。

