?目錄
?
?
第一章:C語言數據類型和表達式
第一題:
第二題:
第三題:
第四題:
第五題:
第六題:
第七題:
第八題:
第九題:
第二章:分支結構程序設計
第一題:
第二題:
第三題:
第四題:
第五題:
第六題:
第七題:
第八題:
第九題:
第三章:循環結構
第一題:
第二題:
第三題:
第四題:
第五題:
第六題:
第四章:數組
第一題:
第二題:
第三題:
第四題:
第五題:
第六題:
第七題:
第八題:
第九題:
第十題:
第十一題:
第十二題:
?
?
第一章:C語言數據類型和表達式
第一題:
設x 、y均為f1oat型變量,則以下不合法的賦值語句是 ( )。A.
x*=y+8;B.
x=y=0;C.
y=(x%2)/10;D.
y=1+x;
分析:對于c,取余運算兩邊必須是整型;
第二題:
下面四個選項中,均是合法整形常量的選項是( )A.
160 、 -0xffff 、 011B.
-01 、 986,012 、 0668C.
-0xcdf 、 01a 、 0xeD.
-0x48a 、 2e5 、 0x
分析:首先你要知道十六進制的數怎么表示,它是以0x為前綴使用 0-9 和 A-F(或 a-f)這些字符來表示數字 0-15,然后八進制是以0為前綴,使用數字 0-7 來表示數字 0-7
所以b錯在0668,八進制中出現了8,
c錯在01a,八進制出現了字母
d錯在2e5,是一個浮點數,不是整數,0x是不完整的十六進制表示
第三題:
表達式下面的程序段將輸出 ▁▁▁▁▁。double pi = 22 / 7, r = 2, g;
g = 2 * pi * r;
printf("%.2f\n", g);A.
12.57B.
0.00C.
12.00D.
13.00
分析:
22/7,因為雙方都是整數,所以得出結果也是整數不會保留小數,所以22/7=3,然后最后是輸出12.00
第四題:
為表示“a和b都不等于0”,應使用的C語言表達式是()。A.
(a!=0) || (b!=0)B.
a || bC.
!(a=0)&&(b!=0)D.
a && b
分析:首先讀懂題,翻譯成a和b都不等于0時為真,所以d肯定對
接下來分析a,b,c
a用||邏輯符,就是只要兩邊一個滿足就為真,那么a不等于0是為真,這個時候b可以為0,照樣表達式成立
b同上
c的表達式就已經錯了,因為()里面表達式應該是判斷,而不是進行賦值
第五題:
設 x、y、t均為int型變量,則執行語句:x=y=3; t= ++x || ++y; 后,y的值為____。A.
1B.
不定值C.
3D.
4
?
分析:執行語句t=++x || ++y;,根據短路邏輯運算符的特性,如果第一個表達式的值為真(非零),則不會執行第二個表達式。先把++x賦給t之后,這個表達式為真不會進行++y。
第六題:
設變量n為float型,m為int類型,則以下能實現將n中的數值保留小數點后兩位,第三位進行四舍五入運算的表達式是( )A.
n=(n*100+0.5)/100.0B.
n=n*100+0.5/100.0C.
n=(n/100+0.5)*100.0D.
m=n*100+0.5,n=m/100.0
分析:這道題看起來抽象,其實原理很簡單,舉個例子
假設n的值為3.4567。
按照選項A的表達式,首先計算 3.4567 * 100 = 345.67,將小數點后兩位的數值變為整數部分。
接著加上0.5,得到 345.67 + 0.5 = 346.17,進行了四舍五入運算。
最后將結果除以100.0,得到 346.17 / 100.0 = 3.4617,將整數部分轉換回小數點后兩位的數值。
因此,選項A的表達式 (n*100+0.5)/100.0 能夠實現將n中的數值保留小數點后兩位,并進行四舍五入運算。
第七題:
表達式下面的程序段將輸出 ▁▁▁▁▁ 。int n = 4, s;
s = 1 / 2 * n * (n + 1);
printf("%d\n", s);A.
10B.
0.025C.
0.625D.
0
思路:
寫這種題,要明白優先運算的優先順序,看s,先算小括號里的,然后從左至右一次運算,即先算1/2,但是1和2是整數運算得出0.5然后取整變成0,因此會輸出0.
第八題:
表達式(x%3)等價于表達式( )。A.
x%3 == 2B.
x%3 == 0C.
x%3 == 1D.
x%3 != 0
?
?思路:
寫這種題記住一點,無需想太多,要想表達式x%3成立,那么x%3的結果就不能為0,因為我們規定表達式值為0就為假,因此表達式等價D。
第九題:
下列不合法的用戶標識符是A.
j2_KEYB.
_8_C.
4d_aD.
Double
思路:用戶標識符遵循特定規則:
- 用戶標識符只能包含字母(大小寫敏感)、數字和下劃線。
- 用戶標識符不能以數字開頭。
- 用戶標識符不能包含空格或其他特殊字符。
因此選C
第二章:分支結構程序設計
第一題:
若a為int類型,且其值為3,則執行完表達式a+= a-= a*a后,a的值是__。A.
9B.
-3C.
6D.
-12
思路:
明白運算符的優先順序,*的優先級高于=和+,因此先從a*a開始運算,a的值為3,a*a=9,然后,a-=9,相當于a=a-9,這個時候a還是3,然后3-9=-6即把-6賦給了a,然后a這個時候的值為-6,然后進行最后一語句,a+=-6,a這個時候是-6,這個表達式相當于a=a-6,所以最后a=-12;
?
?
第二題:
定義int score = 75; 則表達式 80 > score > 70 的值是:A.
0B.
trueC.
1D.
false
思路:
從左至右依次進行,首先80>75為真,那么這個時候表達式返回1,即變成1>70為假,所以返回0
第三題:
下列運算符中優先級最低的是__.A.
IIB.
>=C.
~D.
!=
思路:這里給大家整這道題,也是想給大家總結這個運算符的優先級,記住常見的。
觀察規律,一目運算符>二目運算符>三目運算符,算術運算符就是+ - * / 這些,關系運算符就是> < 這些,并且記住賦值運算符比 逗號運算符強。
因此這道題選擇A
第四題:
設有定義:int a = 1, b = 2, c = 3, d = 4, m = 2, n = 2;
則執行表達式(m = a > b) && (n = c > d);
后,n的值為____。A.
0B.
3C.
1D.
2
?
思路:
由上述介紹了運算符的優先級,那么這道題就如同探囊取物,看表達式,先是a>b,即1>2,為假,返回0,即變成m=0,就是把0賦給了m,表達式為真,然后呢c>d即3>4為假返回0,0賦給了n為真,所以n等于0 對嗎?不對,為什么?錯就錯在你還未理解&&這個運算符,必須兩邊同時成立才為真,但當左邊的表達式為假的時候,他根本不會進行第二個表達式的運算,所以n還是原來的值2,因此這道題為D
這就是邏輯運算符的短路原則,對于||只要第一個操作數為假則不會進行第二個操作數.
對于邏輯或運算符 ||
,如果第一個操作數為真(非零),則整個表達式的值為真,不會再計算第二個操作數。只有當第一個操作數為假(0)時,才會計算第二個操作數。
?
?
第五題:
設 int x=1, y=1; 表達式(!x||y--)的值是( )。A.
-1B.
0C.
1D.
2
思路:
根據上題給大家介紹的邏輯運算符的短路規則,這道題很easy了吧
在這個表達式中,x
的值為 1,非零,所以 !x
為假(0)。因此,整個表達式 (!x || y--)
的值取決于 y--
的結果。
y--
表示先將 y
的值賦給表達式,然后再將 y
的值減 1。由于后綴自減運算符的優先級較低,所以 y--
的值為 1,并且 y
的值被減 1 變為 0。
因此,(!x || y--)
的值為 0 || 1
,即 1
。
答案是 C. 1。
?
第六題:
已知int i, a; 執行語句i=(a=2*3,a*5),a+6;后,變量i的值是( )。A.
6B.
30C.
36D.
12
思路:
還是考察運算符的優先級,之前給大家介紹=的優先級比 , 高,因此先執行逗號表達式a=2*3,a*5
,其中a首先被賦值為6,然后計算a*5
返回結果30,所以整個逗號表達式的值是30。接著,將這個值賦給變量i,即i=30
。
最后,執行語句a+6
,但并沒有把其結果賦給任何變量,所以該語句的執行對i的值沒有影響。
因此,變量i的值是30,選項B正確。
?
第七題:
若變量已正確定義,表達式 (j=3, j++) 的值是____。A.
5B.
4C.
6D.
3
思路:
在表達式(j=3, j++)
中,逗號操作符,
會先執行左邊的表達式j=3
,將3賦值給變量j,然后再執行右邊的表達式j++
。
但是需要注意的是,后置遞增運算符++
會在整個表達式執行完之后才生效。所以在這個表達式中,盡管執行了j=3
的賦值操作,但是j++
的遞增操作并沒有影響到整個表達式的值。
因此,表達式(j=3, j++)
的值是3,選項D正確。
?
第八題:
設a=1,b=2,c=3,d=4,則表達式:a<b?a:c<d?a:d 的結果為( )。A.
3B.
4C.
2D.
1
思路:
對于這種多目運算的怎么分析?
答案就是一步步來,首先我們把這個值帶進去,1<2為真所以a為表達式的值不執行后面。這里給大家延申一些,如果我是說如果,a<b為假的話,那么就會執行c<d,然后根據c<d是否為真進行判斷是執行a還是執行d
?
第九題:
假設所有變量均為整型,則表達式(a = 2, b = 5, b++, a+b)的值是( )A.
2B.
7C.
6D.
8
思路:
在這個表達式中,首先執行 a = 2
,將 2 賦給變量 a
。然后執行 b = 5
,將 5 賦給變量 b
。接下來執行 b++
,將 b
的值增加 1,此時 b
的值為 6。最后執行 a + b
,即 2 + 6,結果為 8。
因此,表達式 (a = 2, b = 5, b++, a+b)
的值為 8。
在這里大家可能會有疑問,為什么不是7,因為b++只要不執行這個語句的時候b已經變成了6。如果說是還在b++這個語句里面,就是先用6然后再加1
?
第三章:循環結構
第一題:
下面這段程序,若scanf輸入k的值為50,則程序將循環有限次,在打印輸出有限行之后,程序將正常結束。#include <stdio.h>
int main(){int k;scanf("%d", &k);int i=100;while(i > k){printf("%d ", i);i++;}return 0;
}
思路:
這道題,可能很多人都是一知半解,覺得i>k為真,并且i還自增,必然一直循環下去,但是要知道int類型的數據所表達的范圍有限。
在這段程序中,如果 scanf
輸入的 k
值為 50,并且 i
的初始值為 100,循環條件 i > k
成立,循環體內的語句會被執行。
每次循環中,會打印輸出 i
的值,并將 i
的值遞增 1。由于 i
是使用整型變量聲明的,整型變量在大多數系統中的范圍是有限的。當 i
遞增到超過整型變量所能表示的最大值時,整型溢出會發生。
對于大多數系統來說,int
類型的范圍是 -2,147,483,648 到 2,147,483,647。當 i
的值增加到超過這個范圍時,它將溢出并變成一個負值。
因此,當 i
遞增到超過 int
類型所能表示的最大值時,循環會終止,程序將正常結束。
?
第二題:
下面這段程序中的循環將是無限循環,程序將始終運行、無法結束(假設運行該程序的計算機系統永遠不會發生意外情況而崩潰或斷電)。#include "stdio.h"
int main(){for(long num=1; num>0; num++)printf("%ld\n", num);return 0;
}
思路:
這道題也是與上道題,同理
?
第三題:
下列程序段輸出結果為 ____。
下列程序段輸出結果為 ____。int a=1,b=2,c=2,t;
while(a<b<c) { t=a; a=b; b=t; c--; }
printf( "%d,%d,%d", a, b, c);
思路:
首先看while循環條件,a<b即1<2為真返回1,變成1<c,即1<2為真然后進入循環體
然后看循環體前三條語句實際就是把a和b的值進行了交換,沒看明白的可以畫個圖模擬一下,然后c--,這個時候c的值變成了1,接著再次進行循環條件的判斷,a<b,因為a和b的值已經交換了,所以變成了2<1即為假,返回0,所以變成了0<c,c的值為1,所以0<1即為真,那么再次進入循環體,然后再次把a和b的值交換,這個時候a再次變成1b再次變成2,c再次--,c就變成了0,所以最終輸出2,1,0
?
第四題:
?
對于循環while(!e) 語句,!e等價于____。A.
e!=1B.
e==0C.
e!=0D.
e==1
思路:
之前的內容講過類似的,再次整出這道題想大家都整,明白,看懂代碼,以后可能也需要寫出這樣的代碼。
這次由大家自行解答,若有問題回到前文再看解析。
第五題:
設有程序段int m=20; while (m=0) m=m++;
則下面描述中正確的是( )。A.
循環體語句一次也不執行B.
循環體語句執行一次C.
while 循環執行 10 次D.
循環是無限循環
思路:
這道題和前面的類似,答案由你來書寫。
第六題:
執行下面的程序后變量a的值是#include <stdio.h>
int main(void)
{int a, b;for (a = 1, b = 1; a <= 100; a++) {if (b > 10)break;if (b % 3 == 1) {b += 3;continue;}b -= 3;}printf("%d\n", a);return 0;
}A.
8B.
5C.
7D.
6
思路:
這道題考察就是簡單循環的理解,建議大家重新理一遍這道題的邏輯,不要直接用編譯器來求答案,理解代碼的邏輯。看懂代碼。
?
第四章:數組
第一題:
在對數組全部元素賦初值時,不可以省略行數,但能省略列數。TF
思路:
對于二維數組,行數可以省略,列數不能省略,舉個例子,arr[][3]={{1,2},{1,2,3}},省略了行數,并不影響我們的理解,明顯可以得出行數為2。列數不能省略,如果不指定列數, 它就不能知道一行放幾個數據了。
第二題:
若有定義float a[6]={1,2,3};,則數組中含有3個元素。TF
?
思路:
數組有6個元素,只不過只指定了前三個元素,那么后三個元素的值。
后三個元素的值不確定。
第三題:
調用strcmp函數比較字符串大小時,通常較長的字符串會較大。TF
思路:
字符串比較大小是按照字典序來比較,不是說字符串長就大。
第四題:
一維數組定義的一般形式如下,其中的數組長度是一個整型常量表達式,給定數組的大小。類型名 數組名[數組長度];TF
思路:
記住即可,數字長度只能放常量不能放變量,比方說int a=100,arr[a]={0} 是錯誤的。因為a是變量。
第五題:
若字符數組s1和s2中均已正確存儲字符串,則可以使用 if(s1>s2) 進行兩字符串大小的比較。TF
思路:
不能直接通過關系運算符進行比較,除非在c++里面,可以通過strcmp來比較。
第六題:
一維數組定義的一般形式如下:類型名 數組名[數組長度];
數組元素引用的一般形式如下:數組名[下標]
在引用數組元素時,下標的合理取值范圍是[0,數組長度-1],下標不能越界。TF
思路:
這個大家記住即可,答案為T
第七題:
"a" 和 'a'是等價的。TF
思路:
第一個是字符串,第二個是字符元素
第八題:
下面描述正確的是A.
字符個數多的字符串比字符個數少的字符串大B.
字符串“ STOP”和“STOP”相等C.
字符串“That”小于字符串“The”D.
兩個字符串所包含的字符個數相同時才能比較字符串
思路:
看c因為第一個和第二個字符都相同,比較第三個,因為a的ascll小于e的ascll所以,第一個字符串小于第二個。
第九題:
以下關于二維數組初始化的說法,正確說法的個數是( )(1)語句int a[2][3]={0}; 能將int型數組a中的每個元素全部初始化為0。(2)語句int a[2][3]=0; 能將int型數組a中的每個元素全部初始化為0。(3)語句int a[2][3]; 能將int型數組中a的每個元素全部初始化為0。(4)語句int a[2][3]={{1,2},{3,4},{5,6}};能將int型數組元素a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2]依次初始化為1,2,3,4,5,6。(5) 語句int a[][3]={1,2,3,4,5,6};能將int型數組元素a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2]依次初始化為1,2,3,4,5,6。(6)語句int a[][3]={{1,2,3},{4,5,6}};能將int型數組元素a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2]依次初始化為1,2,3,4,5,6。
思路:
正確說法的個數是3。(1)語句int a[2][3]={0}; 能將int型數組a中的每個元素全部初始化為0。—— 對,(2)語句int a[2][3]=0; 能將int型數組a中的每個元素全部初始化為0。—— 錯誤,這種語句是錯誤的,無法用這種方式對二維數組進行整體賦值。(3)語句int a[2][3]; 能將int型數組中a的每個元素全部初始化為0。—— 錯誤,這種方式只會在棧上分配空間,但不會對每個元素進行初始化。(4)語句int a[2][3]={{1,2},{3,4},{5,6}};能夠將int型數組元素a[0][0],a[0][1],a[1][0],a[1][1],a[0][2],a[1][2]依次初始化為1,2,3,4,5,6,因此是原來的選項是錯的(5) 語句int a[][3]={1,2,3,4,5,6};能將int型數組元素a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2]依次初始化為1,2,3,4,5,6。—— 對,。(6)語句int a[][3]={{1,2,3},{4,5,6}};能將int型數組元素a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2]依次初始化為1,2,3,4,5,6。—— 正確,這種方式可以對二維數組進行逐個初始化。
第十題:
對于定義 char str[] = "abc\000def\n"(注:其中0為數字零),求字符串str的長度len和數組str的大小size,len和size分別是:A.
3 ,9B.
3 ,11C.
12 ,13D.
3 ,4
思路:
對于定義 char str[] = "abc\000def\n"; ,字符串 str 的長度 len 是指有效字符的個數,不包括字符串結束符 \0。數組 str 的大小 size 則是指整個數組占用的內存空間大小。在這種情況下,字符串 str 的長度 len 為 3,因為 "abc" 是由三個有效字符組成。數組 str 的大小 size 可以通過使用 sizeof 運算符來獲取。sizeof 運算符返回的是數組在內存中所占用的字節數。因為 str 是一個字符數組,所以它占用的內存空間大小等于每個元素的大小乘以元素的個數。每個字符元素的大小為 1 字節。因此,數組 str 的大小 size 取決于編譯器和操作系統的實現。通常情況下,它將是 11 字節(包括字符串結束符 \0)。
并且\0和\n看作是一個字符,字符串末尾還有一個\0為顯示。
第十一題:
有說明語句int a[4][5]; ,則a[2]+3表示__。A.
a數組行下標為2、列下標為3的元素的值B.
a數組第3行的首地址C.
a數組第2行的首地址D.
a數組行下標為2、列下標為3的元素的地址
思路:
a[2]+3實際上表示a數組第3行的首地址,并且向后偏移3個元素的地址。因此,a[2]+3可以表示a數組行下標為2、列下標為3的元素的地址。
所以,選項D.a數組行下標為2、列下標為3的元素的地址是正確的答案。
第十二題:
以下定義語句中不正確的是__。A.
int y[5]={0,1,3,5,7,9};B.
double x[5]={2.0, 4.0, 6.0, 8.0, 10.0}; C.
char c1[]={'1', '2', '3', '4', '5'}; D.
char c2[]={'\x10', '\xa', '\x8'};
思路:
很明顯A的數組越界了,因為數組下標從0,開始,最終最大也是y[4],只能存五個元素,而出現了6個就會越界。
?
?
最后,筆者能力有限,如有錯誤,請指出,一定改正一起進步。
?