1、有以下程序
main(){
int a=1,b=2,m=0,n=0,k;
k=(n=b>a)||(m=a<b);
printf("%d,%d\n",k,m);
}
程序運行後的輸出結果是______。
A:0,0
B:0,1
C:1,0
D:1,1
答案:C
評析:
本題的考查點是邏輯或運算。
a||b若a,b之一爲真,則a||b爲真,但如果a爲真,則b不用考慮,也就是無需計算,仍爲原值。
結合本題,因爲b>a爲真,即n=1,所以m不用計算仍爲原值,且k值爲1。
故本題答案爲C。
2、有以下程序
main(){
int a;
char c=10;
float f=100.0;
double x;
a=f/=c*=(x=6.5);
printf("%d %d %3.1f %3.1f\n",a,c,f,x);
}
程序運行後的輸出結果是______。
A:1 65 1 6.5
B:1 65 1.5 6.5
C:1 65 1.0 6.5
D:2 65 1.5 6.5
答案:B
評析:
本題的考查點是複合的賦值運算符。
在賦值符"="之前加上其它運算符,可以構成複合的運算符。運算方向爲自右至左。
本題中先計算c的值,c=c*(x=6.5)=10*6.5=65;
接下來計算f的值,f=f/c=100.0/65=1.5;
最後計算a的值,a=f,因爲a爲整數,取f的整數部分即爲1。故本題答案爲B。
3、有以下程序
main()
{int x, y, z;
x=y=1;
z=x++,y++,++y;
printf("%d,%d,%d\n",x, y, z);
}
程序運行後的輸出結果是______。
A:2,3,3
B:2,3,2
C:2,3,1
D:2,2,1
答案:C
評析:
本題考查的是C語言的運算規則。
x++:表示在使用x之後,使x的值加1;y++:表示在使用y之後,使y的值加1;++y:表示在使用y之前,使y的值加1。此題中執行z=x++,是將x的值先賦給z,所以z=1,接下來x自行加1,其結果爲2;執行y++後,y=2,執行++y後,y=3。 故本題答案爲C。
4、設a=5,b=6,c=7,d=8,m=2,n=2,執行
(m=a>b)&&(n=c>d)
後n的值爲______。
A:1
B:2
C:3
D:4
答案:B
評析:
本題的考查點是邏輯與運算。
在邏輯表達式的求解中,並不是所有的邏輯運算符都被執行,只是在必須執行下一個邏輯運算符才能求出表達式的解時,才執行該運算符。
本題中,(m=a>b)的值爲0,求出整個表達式的值爲0,不需執行(n=c>d),所以n仍爲2。故本題答案爲B。
5、設int a=12,則執行完語句a+=a-=a*a後,a的值是______。
A:552
B:264
C:144
D:-264
答案:D
評析:
本題的考查點是賦值表達式的求解。
第一步:a*a=144 ;(此時a=12)
第二步:a-=144相當於a=a-144,a=a-144=-132; (此時a=-132)
第三步:a+=a相當於a=a+a,a=a+a=-264;
所以該表達式最後的值應當爲-264。故本題答案爲D。
6、若有以下程序段
int c1=1 ,c2=2,c3;
c3=1.0/c2*c1;
則執行後,c3中的值是______。
A:0
B:0.5
C:1
D:2
答案:A
評析:
1.0/c2*c1即1.0/2*1的值爲0.5,由於c3的類型爲整型,所以在表達式賦值時,進行類型的自動轉換,將0.5轉換爲整型0。本題答案爲A。
7、已有定義:int x=3,y=4,z=5;,則表達式!(x+y)+z-1&&y+z/2的值是______。
A:6
B:0
C:2
D:1
答案:D
評析:
本題的考查點是運算符的優先級。
在本題中,運算符的優先級分別爲:!大於/大於+,-大於&&,即:!(3+4)+5-1&&4+5/2=0+5-1&&4+2=4&&6=1。故本題答案爲D。
8、以下正確的字符串常量是______。
// A:"\\\"
// B:'abc'
// C:Olympic Games
// D:" "
// 答案:D
// 評析:
// 本題的考查點是字符串常量。
// 字符串常量是由一對雙引號括起的字符序列。例如:"CHINA","C program","$12.5" 等都是合法的字符串常量。
// 選項A中雙引號內使用了兩個轉義符,即後一個雙引號也作爲字符串的內容了,故此字符串中還缺少用於表示字符串結束的引號,所以選項A的表示法錯誤;
// 選項B,C均沒有用雙引號括起來,所以並不是字符串;選項D表示空字符串,是正確的表示法。故本題答案爲D。
9、若有下面的說明和定義,則sizeof(struct aa)的值是______。
struct aa
{int r1;double r2;float r3;
union uu{
char u1[5];
long u2[2];
}ua;
}maya;
A:30
B:29
C:24
D:22
答案:D
評析:
本題的考查點是結構體的長度。
sizeof(x)爲運算符,它運算的結果是x型的數據結構佔用的內存字節數,題目中定義了一個結構體aa,它的長度爲其中數據成員所佔內存的總和。
int型的變量需要2個字節;double型的變量需要8個字節;float型的變量需要4個字節;題目中結構體aa包含了一個共用體uu,而共用體變量在內存中所佔的長度等於最長的成員的長度,而char型的變量需要1個字節,char u1[5]即需要5個字節,long型的變量需要4個字節,long u2[2]即需要8個字節,所以共用體uu需要8個字節的存儲空間;因此,sizeof(struct aa)的值應爲2+8+4+8=22個字節。
故本題答案爲D。
10、若有以下說明和定義
union dt {
int a;char b;double c;
} data;
以下敘述中錯誤的是______。
A:data的每個成員起始地址都相同
B:變量data所佔的內存字節數與成員c所佔字節數相等
C:程序段:data.a=5;printf("%f\n",data.c);輸出結果爲5.000000
D:data可以作爲函數的實參
答案:C
評析:
本題考查的是共用體。
union是表示共用體的關鍵字,說明其內的成員a,b,c共佔用同一個內存空間,所以data的每個成員起始地址都相同;共用體變量所佔的內存長度等於最長的成員的長度,故變量data所佔的內存字節數與成員c所佔字節數相等;但由於各成員變量的類型不一致,所以它們的存儲方式也不相同,整型佔用2個字節的存儲空間,double型佔用8個字節的存儲空間;
另外data可以作爲函數的實參,此時data作爲一個地址進行地址傳送;
執行"data.a=5;printf("%f\n",data.c);"系統不能自動將整型變量轉換爲浮點型值,printf函數只是將內存中的數據以不同的類型輸出,而不能將內存中的整型數據自動轉換爲等值的浮點數,故C是錯誤的。
故本題答案爲C。
11、設有以下定義
union data{
int d1; float d2;
} demo;
則下面敘述中錯誤的是______。
A:變量demo與成員d2所佔的內存字節數相同
B:變量demo中各成員的地址相同
C:變量demo和各成員的地址相同
D:若給demo.d1賦99後,demo.d2中的值是99.0
答案:D
評析:
本題的考查點是共用體的存儲特點。
共用體的存儲特點:
(1)同一塊內存可以存放不同類型的數據,但在某一時刻只能存放其中的一種;
(2)共用體變量中起作用的成員是最後一次存放的成員,即在存入一個新的成員後原有的成員失去作用,所以選項D的說法是錯誤的;
(3)共用體變量的地址和它的成員的地址是同一個地址,且各成員的地址也相同,因爲共用體成員是共同佔用同一段存儲空間的,所以選項B,C的說法都正確;
(4)共用體變量不能整體被賦值,也不能給共用體變量賦初值;
(5)共用體所佔的內存長度等於最長的成員的長度,所以選項A的說法正確。
故本題答案爲D。
12、有以下程序,用於進行編譯器大小端模式判斷
main(){
union{
char ch[2];
int d;
}s;
s.d=0x4321;
printf("%x,%x\n",s.ch[0],s.ch[1]);
}
在16位編譯系統上,程序執行後的輸出結果是______。
答案:21,43
評析:
本題考查的是共用體。
int類型變量和字符數組ch共用兩個字節的相同的存儲單元,通常ch[0]位於低字節,ch[1]位於高字節,所以s.ch[0]=21,s.ch[1]=43。
故本題答案爲21,43。
13、設有如下枚舉類型定義
enum language {
Basic=3,Assembly=6,Ada=100,COBOL,Fortran
};
枚舉量Fortran的值爲______。
答案:102
評析:
本題考查的是枚舉類型。
這個枚舉中共有5個元素,前三個已有明確的賦值,而COBOL和Fortran沒有明確的賦值,枚舉的語法規定當枚舉元素沒有賦值時,其值爲其前一個元素的值加一,所以COBOL的值爲101,故Fortran的值應爲102。
故答案爲102。
14、下列選項中正確的語句組是______。
// A:char s[8]; s={"Beijing"}
// B:char *s; s={"Beijing"}
// C:char s[8]; s="Beijing"
// D:char *s; s="Beijing"
// 答案:D
// 評析:
// 本題的考查點是字符串的定義和賦初值。
// 選項A.C是對字符數組初始化,可以是逐個字符賦給數組中各元素,也可以對整個字符串賦初值,但必須是字符型(s型),並且C語言規定,只有靜態存儲(static)數組和外部存儲(extern)數組才能初始化。所以選項A.C都不對。應該這樣來實現:static char s[ ]="Beijing";選項B.D是想通過字符指針來實現,正確的格式是char *s; s="Beijing"。
// 故本題答案爲D。
// 知識點:知識點/知識點/數組的定義和引用/字符串與字符數組
15、在C語言中,函數中變量的隱含存儲類別是______。
A:auto
B:static
C:extern
D:無存儲類別
答案:A
評析:
本題考查的是函數中變量的存儲類別。
函數中變量的存儲類別包括auto,static,extern,其中auto爲隱含存儲類別,static爲靜態存儲類別,register是寄存器存儲類別。
故本題答案爲A。
16、若程序中定義了以下函數,
double myadd(double a,double b){
return(a+b);
}
並將其放在調用語句之後,則在調用之前應該對函數進行說明,以下選項中錯誤的說明是______。
A:double myadd(double a, b);
B:double myadd(double,double);
C:double myadd(double b, double a);
D:double myadd(double x, double y);
答案:A
評析:
對函數的"定義"和"說明"不是一回事。"定義"是指對函數功能的確立,包括指定函數名,函數值類型、形參及其類型、函數體等,它是一個完整的、獨立的函數單位。
而"說明"則是對已定義的函數的返回值進行類型說明(或稱"申明"),它只包括函數名、函數類型、以及一個空的括弧,不包括形參和函數體。
對被調函數進行說明的作用是告訴系統:在本函數中將要用到的某函數是XX類型。也就是說明該函數的返回值的類型,以便在主調函數中按此類型對函數值作相應的處理。
本題選項A中,函數參數列表中,不可以用一類型聲明多個變量,即變量b沒有被聲明,所以出錯。
故本題答案爲A。
17、有以下程序
int a=1;
int f(int c){
static int a=2;
c=c+1;
return (a++)+c;
}
main(){
int i,k=0;
for(i=0;i<2;i++){
int a=3; k+=f(a);
}
k+=a;
printf("%d\n",k);
}
程序的運行結果是______。
A:14
B:15
C:16
D:17
答案:A
評析:
本題的考查點是變量的作用域和生存期。
本題定義的"int a=1;"中的全局變量a,其作用範圍是從定義此變量的位置開始到本源文件結束;
"static int a=2;"中的靜態局部變量a的作用範圍是其所在的函數f,並對其只賦一次初值,以後每次調用函數時不再重新賦初值,而只是保留上次函數調用結束時的值。
在主函數中,執行第一次for循環,i=1:k=k+f(3),其中f(3)的值爲調用函數f後返回的值,即"(a++)+c"的值,由於此時的值爲2+4=6,所以第一次for循環結束後,k=6,a=3;i=2:k=6+f(3),f(3)的值同樣爲"(a++)+c"的值
由於在f函數中a是靜態變量,所以第二次調用f函數時a的值爲第一次調用f函數結束時的值3,故(a++)+c=3+4,所以第二次for循環結束後,k=6+7,即k的值爲13;
for循環執行兩次結束後,執行k+=a,由於此時的a的值是全局變量的值,所以k=k+a=13+1=14。故程序運行後的結果爲14。
故本題答案爲A。
18、在一個C源程序文件中所定義的全局變量,其作用域爲______。
A:所在文件的全部範圍
B:所在程序的全部範圍
C:所在函數的全部範圍
D:由具體定義位置和extern說明來決定範圍
答案:D
評析:
本題的考查點是全局變量的作用域。
全局變量也稱爲外部變量,它是在函數外部定義的變量。它不屬於哪一個函數,它屬於一個源程序文件。其有效範圍是從定義變量的位置開始到本源文件結束。
在函數中使用全局變量,一般應作全局變量說明。只有在函數內經過說明的全局變量才能使用。全局變量的說明符爲extern。但在一個函數之前定義的全局變量,在該函數內使用可不再加以說明。
故本題答案爲D。