1. 按照標識符的要求,(A)不能組成標識符。
? ?? A.連接符
? ? ?B.下劃線
? ? ?C.大小寫字母
? ? ?D.數字字符
在大多數編程語言中,標識符通常由字母(包括大寫和小寫)、數字和下劃線組成,但不能以數字開頭,并且不能包含連接符等特殊字符。
?
2. 在C語言中,數字029是一個(D)。
? ? ?A.八進制數
? ? ?B.十進制數
? ? ?C.十六進制數
? ? ?D.非法數
八進制數以數字?
0
?開頭,但八進制數的數字只能是?0 - 7
?。十進制數就是我們平常使用的普通數字,不需要前綴。
?十六進制數以?
?0x
?或?0X
?開頭。例如,八進制數?
027
?是合法的,十進制數?29
?直接寫為?29
?,十六進制數?0x1D
?是合法的。所以?029
?是一個非法數
?
3. 若有char w; int x; float y; double z;
?則表達式w*x+z-y
值的數據類型為(D)。
? ? ?A.float
? ? ?B.char
? ? ?C.int
? ? ?D.double
在 C 語言中,當進行混合運算時,運算結果的類型會自動轉換為參與運算的操作數中精度最高的類型.
?
4. 在c語言中,不允許有常量的數據類型是(B)
? ? ?A.整型
? ? ?B.結構型
? ? ?C.字符型
? ? ?D.字符串
結構體是一種自定義的數據類型,通常用于組合不同類型的數據來創建更復雜的數據結構,但結構體本身不能直接作為常量。結構體的變量可以有常量的值,但結構體類型不能直接表示為常量。
?
5. 下列運算符中優先級最低的是? (A)
? ? ?A.? II
? ? ?B.? >=
? ? ?C.? !=
? ? ?D.? ~
?在 C 語言中,邏輯或運算符“||”的優先級低于關系運算符“>=”和“!=”,按位取反運算符“~”是單目運算符,優先級較高。關系運算符“>=”和“!=”的優先級相同。
?例如,對于表達式?
a >= b || c!= d
?,會先計算關系運算?a >= b
?和?c!= d
?,然后再進行邏輯或運算。
?
6.?若x
為浮點型,則表達式x=10/4
為(B)。
? ? ?A.? 2.5
? ? ?B.? 2.0
? ? ?C.? 2
? ? ?D.? 3
在 C 語言中,當整數相除(
10/4
)時,結果會進行整數除法,得到的結果是整數?2
?。之后將這個整數?
2
?賦值給浮點型變量?x
?時,會進行類型轉換,將整數?2
?轉換為浮點數?2.0
?。例如,如果后續對?x
?進行輸出,使用?printf("%f", x);
?輸出的結果將是?2.000000
?。
?
7.?邏輯運算符兩側運算對象的數據類型(D)。
? ? ?A. 只能是 0 或 1
? ? ?B. 只能是 0 或非 0 正數
? ? ?C. 只能是整型或字符型的數據
? ? ?D. 可以是任何類型的數據
邏輯運算符包括?
&&
(邏輯與)、||
(邏輯或)和?!
(邏輯非)對于邏輯與?
&&
?和邏輯或?||
?,其操作數會被隱式轉換為布爾值(非零值被視為?true
?,零值被視為?false
?)進行運算.所以邏輯運算符兩側運算對象的數據類型可以是任意類型.
?
8.?若p1
、p2
都是整型指針,p1
已經指向變量x
,要使p2
也指向x
, (A)是正確的。??(重點)
? ? ?A.??p2 = p1;
? ? ?B.??p2 = **p1;
? ? ?C.??p2 = &p1;
? ? ?D.??p2 = *p1;
在 C 語言中,指針變量存儲的是另一個變量的地址。
?當?
p1
?已經指向變量?x
?時,要使?p2
?也指向?x
?,只需要將?p1
?所存儲的地址賦值給?p2
?即可。選項 C 中,
&p1
?是取?p1
?這個指針變量本身的地址,而不是?x
?的地址。選項 D 中,
?*p1
?是獲取?p1
?所指向變量的值,不是地址。例如,如果有?
int x = 5; int *p1 = &x;
?,執行?p2 = p1;
?后,對?*p2
?的操作就等同于對?*p1
?和?x
?的操作。
?
9. 以下選項中,對基本類型相同的指針變量不能進行運算的運算符是(A)。
? ? ?A. +
? ? ?B. -
? ? ?C. =
? ? ?D. ==
在 C 語言中,對于基本類型相同的指針變量,可以進行減法運算(
?-
),用于計算兩個指針之間的元素個數差。可以進行賦值運算(
?=
),將一個指針的值賦給另一個指針。可以進行比較運算(
?==
),判斷兩個指針是否指向相同的地址。但是不能進行加法運算(
+
),因為指針的加法運算在 C 語言中沒有明確的語義和定義。?
?
10.?int a=5,*ap=&a ;則下列表達式錯誤的是(D)? ? ?(重點)
? ? ?A.? &*ap 相當于&a
? ? ?B.? *&a 相當于ap
? ? ?C.? (*ap)++ 相當于a++
? ? ?D.? *ap++ 是合法訪問
選項 A 中,
?&*ap
?,先進行?*ap
?得到?a
?,再對其取地址就是?&a
?,所以該表達式正確。選項 B 中,
?*&a
?,先對?a
?取地址得到?&a
?,再進行解引用就是?a
?,與?ap
?所指向的內容相同,所以該表達式正確。選項 C 中,
?(*ap)++
?,先解引用得到?a
?,然后對?a
?進行自增,相當于?a++
?,所以該表達式正確。選項 D 中,
?*ap++
?是錯誤的,它的本意可能是先使用?*ap
?的值,然后讓?ap
?指針自增。但由于運算符優先級的問題,這個表達式會先計算?ap++
?,即讓指針?ap
?自增,然后再進行解引用,這不是預期的操作,所以該表達式錯誤。例如,如果按照錯誤的方式使用?
*ap++
?,可能會導致程序出現未定義的行為或錯誤的結果
11.?下面是對s的初始化,其中不正確的是(D)
? ? ?A. char s[5]={"abc"};
? ? ?B. char s[5]={'a', 'b', 'c'};
? ? ?C. char s[5]="";
? ? ?D. char s[5]="abcdef";
選項 A ,
?char s[5] = {"abc"};
?,數組長度為 5,初始化字符串?"abc"
?,剩余兩個位置自動補?'\0'
?,是正確的。選項 B ,
?char s[5] = {'a', 'b', 'c'};
?,這種初始化方式沒有自動添加字符串結束符?'\0'
?,但在數組長度范圍內,也是可以的。選項 C ,
?char s[5] = "";
?,初始化一個空字符串,剩余位置自動補?'\0'
?,是正確的。選項 D ,
?char s[5] = "abcdef";
?,初始化的字符串長度超過了數組的定義長度,會導致越界,是不正確的。例如,如果定義?
char s[7] = "abcdef";
?,就是正確的初始化。
?
12.?若有int x=1;,執行下列程序段后,變量x的正確結果是:(D)
? ? ?A. 1
? ? ?B. 2
? ? ?C. 3
? ? ?D. 4
在這個?
switch
?語句中,x * 10
?的值為?10
?。首先會匹配到?
case 10
?,執行?x += 1
?,此時?x
?的值變為?2
?。由于沒有?break
?語句,會繼續執行下面的?case 11
?和?default
?中的語句,分別再次執行?x += 1
?。所以經過這一系列操作后,x
?的值最終變為?4
?
?
13. 下列程序段的功能是(D)
? ? ?A. 自然數1~9的累加和
? ? ?B. 自然數1~10的累加和
? ? ?C. 自然數1~9中的奇數之和
? ? ?D. 自然數1~10中的偶數之和
在這個程序中,
?for
?循環的條件是?i < 10
?,且?i
?的步長為?2
?,即?i
?依次取值為?1
、3
、5
、7
、9
?。在循環體中,進行累加的是?
?i + 1
?,即?2
、4
、6
、8
、10
?。所以這個程序段的功能是計算自然數?
1
?到?10
?中的偶數之和。例如,如果將循環體修改為?
s += i
?,那么就是計算自然數?1
?到?9
?中的奇數之和。
?
?14.?對于 C/C++語言的函數,下列敘述中正確的是(A)。
? ? ?A. 函數的定義不能嵌套,但函數調用可以嵌套
? ? ?B. 函數的定義可以嵌套,但函數調用不能嵌套
? ? ?C. 函數的定義和調用都不能嵌套
? ? ?D. 函數的定義和調用都可以嵌套
在 C/C++語言中,函數的定義不能嵌套,也就是說不能在一個函數的定義內部再定義另一個函數。但是函數的調用是可以嵌套的,即在一個函數內部可以調用其他函數,被調用的函數內部還可以再調用其他函數。
?
15.?在一個被調用函數中,關于 return 語句使用的描述,錯誤的是(D)。
? ? ?A. 被調用函數中可以不用 return 語句
? ? ?B. 被調用函數中可以使用多個 return 語句
? ? ?C. 被調用函數中,如果有返回值,就一定要有 return 語句
? ? ?D. 被調用函數中,一個 return 語句可以返回多個值給調用函數
選項 A ,被調用函數中可以不用?
?return
?語句,例如當函數不需要返回值時。選項 B ,被調用函數中可以使用多個?
?return
?語句,根據不同的條件在不同的位置返回。選項 C ,被調用函數中,如果有返回值,就一定要有?
?return
?語句來返回具體的值。選項 D ,一個?
?return
?語句只能返回一個值給調用函數,不能返回多個值。例如,一個計算兩個數之和的函數,如果要返回結果,就需要使用?
return a + b;
?這樣的語句來返回一個值。
?
?16. 若程序中定義了以下函數
double myadd(double a,double b)
{ return (a+b); }
并將其放在調用語句之后,則在調用之前應該對該函數進行說明, 以下選項中錯誤的說明是(A)。
? ? ?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 中那樣只指定第一個參數的類型而省略第二個參數的類型。
?選項 B 、C 、D 都是正確的函數聲明方式,只要參數的類型正確,參數的名稱可以與定義中的不同。
?例如,如果函數調用時傳遞的參數類型與聲明不一致,可能會導致編譯錯誤。
?
17.?若有函數max(a,b),為了讓函數指針變量p指向函數max,正確的賦值方式是(A)。
? ? ?A. p=max;
? ? ?B. *p=max;
? ? ?C. p=max(a,b);
? ? ?D. *p=max(a,b);
?在 C 語言中,要讓函數指針變量?
?p
?指向函數?max
?,應該使用?p = max;
?這種賦值方式。選項 B 中,
?*p = max;
?這種寫法是錯誤的,不能通過解引用的方式給函數指針賦值。選項 C 中,
?p = max(a,b);
?這是調用函數?max
?并將返回值賦給?p
?,而不是讓?p
?指向函數?max
?。選項 D 中,
?*p = max(a,b);
?同樣是錯誤的寫法,不能對函數指針進行這樣的操作。例如,如果后續通過?
p
?來調用函數?max
?,可以寫成?(*p)(a, b);
?
18.?若有函數int func(int a,int b),函數指針變量p已經指向func函數,那么下列用指針方式調用函數的正確方法是(C)。
? ? ?A.? (*p)func(2,3);
? ? ?B.? *func(2,3);
? ? ?C.? p(2,3);
? ? ?D.? *p(2,3);
當函數指針變量?
?p
?已經指向函數?int func(int a, int b)
?時,用指針方式調用函數的正確方法是?p(2, 3)
?。選項 A 中,
?(*p)func(2, 3)
?這種寫法是錯誤的,不能在函數指針前再加?*
?然后跟函數名。選項 B 中,
?*func(2, 3)
?這種寫法是錯誤的,不能直接對函數名使用解引用操作。選項 D 中,
*p(2, 3)
?這種寫法也是錯誤的。
?
19.??若有以下定義和語句:
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
則不能表示a數組元素的表達式是(B)
? ? ?A. *p
? ? ?B. a[10]
? ? ?C. *a
? ? ?D. a[p-a]
選項 A ,
?*p
?,因為?p
?指向數組?a
?的首元素,所以?*p
?能表示數組?a
?的第一個元素。選項 B ,
?a[10]
?,數組?a
?的有效下標是?0
?到?9
?,a[10]
?超出了數組的范圍,是錯誤的表達式。選項 C ,
?*a
?,等同于?a[0]
?,能表示數組?a
?的第一個元素。選項 D ,
a[p - a]
?,因為?p
?指向?a
?的首元素,所以?p - a
?的值為?0
?,a[p - a]
?就等同于?a[0]
?,能表示數組?a
?的第一個元素。
?
20.?若已定義:
int a[9],*p=a;
并在以后的語句中未改變p的值,不能表示a[1] 地址的表達式是(C)
? ? ?A. p+1
? ? ?B. a+1
? ? ?C. a++
? ? ?D. ++p
?選項 A ,
?p + 1
?,因為?p
?是指向?int
?類型的指針,p + 1
?表示指向數組?a
?中下一個元素(即?a[1]
?)的地址。選項 B ,
?a + 1
?,數組名?a
?本身代表數組的首地址,a + 1
?表示數組中第二個元素(即?a[1]
?)的地址。選項 C ,數組名?
?a
?是一個地址常量,不能進行自增(a++
?)操作,這樣的表達式是錯誤的。選項 D ,
?++p
?,使?p
?指向下一個元素(即?a[1]
?)的地址。例如,如果要通過指針訪問?
a[1]
?的值,可以使用?*(p + 1)
?或者?*(a + 1)
?。
?
21.?以下數組定義中錯誤的是(B)。
? ? ?A.?int x[][3]={0};
? ? ?B.?int x[2][3]={{1,2},{3,4},{5,6)};
? ? ?C.?int x[][3]={{1,2,3},(4,5,6)};
? ? ?D.?int x[2][3]={1,2,3,4,5,6};
對于二維數組?
int x[2][3]
?,初始化時應該提供兩行數據,每行包含三個元素。選項 A ,
int x[][3]={0};
?,可以這樣初始化,未明確指定行數,根據后面的初始化值可以推斷出行數。選項 C ,
int x[][3]={{1, 2, 3}, {4, 5, 6}};
?,初始化方式正確。選項 D ,
int x[2][3]={1, 2, 3, 4, 5, 6};
?,按順序初始化數組元素,方式正確。
22.?有兩個字符數組a,b,則以下正確的輸入語句是(B)
? ? ?A.?gets(a,b);
? ? ?B.?scanf("%s%s",a,b);
? ? ?C.?scanf("%s%s",&a,&b);
? ? ?D.?gets("a"),gets("b");
選項 A ,
?gets
?函數一次只能接受一個字符串的輸入,不能同時輸入兩個字符串,所以?gets(a, b)
?是錯誤的。選項 B ,
?scanf("%s%s", a, b)
?是正確的輸入格式,可以依次輸入兩個字符串分別存儲到數組?a
?和?b
?中。選項 C ,數組名本身就代表數組的首地址,不需要再使用取地址符?
?&
?,所以?scanf("%s%s", &a, &b)
?是錯誤的。選項 D ,
?gets
?函數的參數應該是字符數組名,而不是字符串?"a"
?和?"b"
?,所以?gets("a"), gets("b")
?是錯誤的。例如,如果輸入?
hello world
?,那么?a
?中存儲?hello
?,b
?中存儲?world
?。
?
23.?下面的程序段將輸出 (C) 。
char s[10] = "abcd";
printf("%d\n", sizeof(s));
? ? A. 4
? ? B. 5
? ? C. 10
? ? D. 11
sizeof
?操作符用于獲取變量或數據類型所占的字節數。對于數組,sizeof
?返回的是數組分配的總字節數。
24.?設有數組定義:char array [ ]="China"; 則數組 array所占的空間為(C)。
? ? ?A. 4個字節
? ? ?B. 5個字節
? ? ?C. 6個字節
? ? ?D. 7個字節
字符串?
?"China"
?包含 5 個字符?'C'
、'h'
、'i'
、'n'
、'a'
,但在 C 語言中,字符串會以?'\0'
?作為結束標志。所以數組?
?array
?實際存儲的是?"China\0"
?,共 6 個字符。每個字符占用 1 個字節,所以數組?
?array
?所占的空間為 6 個字節。例如,如果定義?
char array[] = "Hello"
?,那么數組實際存儲的是?"Hello\0"
?,占用 6 個字節。?
?
25.? 對于以下定義,不正確的敘述是(B)。
struct ex { int x;float y;char z ;
} example;
? ? ?A.?struct
是定義結構類型的關鍵字
? ? ?B.?example
是結構類型名
? ? ?C.?x
,?y
,?z
都是結構成員名
? ? ?D.?struct ex
是結構類型名
?
struct ex
?是結構類型名,example
?是使用?struct ex
?定義的結構變量名,而不是結構類型名。
海漫浩浩,我亦苦作舟!大家一起學習,一起進步!??