天天看點

C語言易錯的選擇題

1.若有定義:int a,b.c;以下選項中的指派語句正确的是(A)

A)a=(b=c)+1;

B(a=b)=c=1:

C)a=(b==c)=1;

D)a+b=c;

解析:指派運算結合性為由右向左結合,指派運算符左值為變量,右值為變量或常量,且左右兩邊資料類型相同才能實作指派。A選項中,将c指派給b,然後将b加1指派給a,正确的指派語句,A選項正确。B選項中,将1指派給c,指派運算(a=b)=c中左值為表達式,不是變量不能被指派,B選項錯誤。C選項中指派運算(b==c)=1左值為邏輯表達式,不是變量不能被指派,C選項錯誤。D選項左值(a+b)為表達式,不是變量不能被指派,D選項錯誤。

2.以下選項中,合法的C語言實數是(B)

A)3.1e0.4

B).2e0

C)E13

D)7.12E

解析:實型常量:用帶小數點的數字表示,其值有兩種表達形式,分别為十進制小數形式和指數形式。十進制小數形式由數字和小數組成,必須有小數點,且小數點的位置不受限制。指數形式由十進制數加階碼标志“e"或”E”以及階碼(隻能為整數,可以帶符号)組成。2e0為指數形式實數,B選項正确。3.1e0.4,階數不是整數,A選項錯誤。E13階碼标志前缺少十進制數,C選項錯誤。7.12E缺少階碼,D選項錯誤。

3.有如下程式

#include <stdio.h>

main{

intx=0x13;

if(x=0x18)printf("T);

printf("F");

printf("n);

}

程式運作後的輸出結果是(A)

A)TF

B)T

C)F

D)TFT

【解析】x=0x18為指派表達式,十六進制數0x18非0,即x非0,條件成立輸出T,之後再輸出F與回車符。程式運作後的輸出結果是TF,A選項正确。

4.有一下程式段

FILE*fp;

if((fp=fopen("test.txt","w))==NULL)

{

printf (不能打開檔案!);

exit(0);

}

else printf(“成功打開檔案!”);

若指定檔案test.txt不存在,且無其他異常,則以下叙述錯誤的是(A)

A.輸出“不能打開檔案

B.輸出”成功打開檔案!

C.系統将按指定檔案名建立檔案

D.系統将為寫操作建立文本檔案

解析 :fopen函數以一定方式打開指定檔案,傳回一個指向檔案的檔案指針,如果不能實作打開指定檔案的操作,則傳回一個空指針NULL。如果指定文牛不存在則建立一個檔案名為指定檔案名的新檔案,然後打開它。在指定檔案有錯誤或者指定檔案不存在卻不能建立新檔案的情況下,打開檔案操作錯誤,傳回指針。本題程式中,檔案test.txt不存在,但無其他異常,表示可以建立新檔案,命名為test.tst,C選項叙述正确,并以隻寫方式打開它,D選項叙述正确,傳回指檔案的指針,條件不成立,輸出“成功打開檔案!”,B選項叙述正确,A選項叙述錯誤。

5.有以下程式

#inchude<stdio.h>

#define N 2

#define M N+1

#define MUN(M+1)*M/2

main(){

printf("%dn",MUN);

程式運作後的輸出結果是(A)

A)8  B)9  C)5 D)6

解析:【我錯誤的解法】将M=N+1=3帶入(M+1)*M/2=(3+1)*3/2=6

【正确解法】(M+1)*M/2換成(N+1+1)*N+1/2,将N=2代入得到MUN=8,程式的運作結果是8,A選項正确。

6.若有以下程式

#include<stdio.h>

#define S(x)(x)*(x)

#define T(x)S(x)/S(x)+1

main()

{int k=3,j=2;

printf("%d,%dn",S(k+j),T(k+j));

}

則程式的輸出結果是(D)

A.11.2   B25.2  C.11,12  D.25.26

【解析】本題考查宏定義,宏定義隻是做個簡單的替換,執行S(k+j)=(k+j)*(k+j)=25,T(k+j)=S(k+j)/S(k+j)+1=(k+j)*(k+j)/(k+j)*(k+j)+1=26,選項D正确。這種題目 需要注意是否有括号。

7.有以下程式

#include <stdio.h>

struct link{

int data;

struct link*next;

}

main(){

struct link*h,a,b;

h=&a,a.data=10;a.next=&b;b.data=20;

}

程式運作時不能輸出10.20的語句是(A)

A) printf("%d,%d \n",h->data,a. next. data);

B) printf("%d.%d n",a data,(*a next). data);

C) printf("%d,%d n",h->data,(*a. next). data):

D) printf("%d,%d n",a. data,a. next->data);

解析:可用以下3種形式來引用結構體變量中的成員:結構體變量名.成員名;指針變量名->成員名;(*指針變量名).成員名。主函數定義了兩個結構體變量a,b其成員data分别為10和20,且a成員指針指向b。A選項中a.next為指針,其引用格式為a.next->data與(*a.next).data,A選項錯誤。B選項a.data=10,(*a.next).data=20,正确輸出10.20;C選項h->data=10,(*a.next).data=20,能正确輸出10,20;D選項a.data=10,a.next->data=20,能正确輸出10,20。

8.若有說明語句:char c='\72';則變量c中存放的是(B)

A)2個字元  B)1個字元  C)3個字元    D)說明語句不合法

解析:用一對單引号括起來的單個字元為字元常量,以"\"開頭的轉義字元也是字元常量。"\"後可以為某些單個字元也可以為八進制或十六進制數字,故c中存放的是一個字元。B選項正确。