目录

 

 

第一章: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 、 011


B.
-01 、 986,012 、 0668


C.
-0xcdf 、 01a 、 0xe


D.
-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.57


B.
0.00


C.
12.00


D.
13.00

分析:

22/7,因为双方都是整数,所以得出结果也是整数不会保留小数,所以22/7=3,然后最后是输出12.00

第四题:

为表示“a和b都不等于0”,应使用的C语言表达式是()。


A.
(a!=0) || (b!=0)


B.
a || b


C.
!(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.
1


B.
不定值


C.
3


D.
4

 

分析:执行语句t=++x || ++y;,根据短路逻辑运算符的特性,如果第一个表达式的值为真(非零),则不会执行第二个表达式。先把++x赋给t之后,这个表达式为真不会进行++y。

第六题:

设变量n为float型,m为int类型,则以下能实现将n中的数值保留小数点后两位,第三位进行四舍五入运算的表达式是( )


A.
n=(n*100+0.5)/100.0


B.
n=n*100+0.5/100.0


C.
n=(n/100+0.5)*100.0


D.
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.
10


B.
0.025


C.
0.625


D.
0

思路:

写这种题,要明白优先运算的优先顺序,看s,先算小括号里的,然后从左至右一次运算,即先算1/2,但是1和2是整数运算得出0.5然后取整变成0,因此会输出0.

第八题:

表达式(x%3)等价于表达式( )。


A.
x%3 == 2


B.
x%3 == 0


C.
x%3 == 1


D.
x%3 != 0

 

 思路:

写这种题记住一点,无需想太多,要想表达式x%3成立,那么x%3的结果就不能为0,因为我们规定表达式值为0就为假,因此表达式等价D。

第九题:

下列不合法的用户标识符是


A.
j2_KEY


B.
_8_


C.
4d_a


D.
Double

思路:用户标识符遵循特定规则:

  1. 用户标识符只能包含字母(大小写敏感)、数字和下划线。
  2. 用户标识符不能以数字开头。
  3. 用户标识符不能包含空格或其他特殊字符。

因此选C

第二章:分支结构程序设计

第一题:

若a为int类型,且其值为3,则执行完表达式a+= a-= a*a后,a的值是__。


A.
9


B.
-3


C.
6


D.
-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.
0


B.
true


C.
1


D.
false

思路:

从左至右依次进行,首先80>75为真,那么这个时候表达式返回1,即变成1>70为假,所以返回0

第三题:

下列运算符中优先级最低的是__.


A.
II


B.
>=


C.
~


D.
!=

思路:这里给大家整这道题,也是想给大家总结这个运算符的优先级,记住常见的。

4112528002e9414f89efe3022c94f3e3.png

67cf2a6ec8ab4a4788f29372ba7cfc39.png

37dd18c2f3ac4fedab7c7ab270f26ac0.png

观察规律,一目运算符>二目运算符>三目运算符,算术运算符就是+ - * / 这些,关系运算符就是> < 这些,并且记住赋值运算符比 逗号运算符强。

因此这道题选择A

第四题:

设有定义:

int a = 1, b = 2, c = 3, d = 4, m = 2, n = 2;
则执行表达式

(m = a > b) && (n = c > d);
后,n的值为____。


A.
0


B.
3


C.
1


D.
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.
-1


B.
0


C.
1


D.
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.
6


B.
30


C.
36


D.
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.
5


B.
4


C.
6


D.
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.
3


B.
4


C.
2


D.
1

思路:

对于这种多目运算的怎么分析?

答案就是一步步来,首先我们把这个值带进去,1<2为真所以a为表达式的值不执行后面。这里给大家延申一些,如果我是说如果,a<b为假的话,那么就会执行c<d,然后根据c<d是否为真进行判断是执行a还是执行d

 

第九题:

假设所有变量均为整型,则表达式(a = 2, b = 5, b++, a+b)的值是( )


A.
2


B.
7


C.
6


D.
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!=1


B.
e==0


C.
e!=0


D.
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.
8


B.
5


C.
7


D.
6

思路:

这道题考察就是简单循环的理解,建议大家重新理一遍这道题的逻辑,不要直接用编译器来求答案,理解代码的逻辑。看懂代码。

 

第四章:数组

第一题:

在对数组全部元素赋初值时,不可以省略行数,但能省略列数。


T

F

思路:

对于二维数组,行数可以省略,列数不能省略,举个例子,arr[][3]={{1,2},{1,2,3}},省略了行数,并不影响我们的理解,明显可以得出行数为2。列数不能省略,如果不指定列数, 它就不能知道一行放几个数据了。

第二题:

若有定义float a[6]={1,2,3};,则数组中含有3个元素。


T

F

 

思路:

数组有6个元素,只不过只指定了前三个元素,那么后三个元素的值。

后三个元素的值不确定。

第三题:

调用strcmp函数比较字符串大小时,通常较长的字符串会较大。


T

F

思路:

字符串比较大小是按照字典序来比较,不是说字符串长就大。

第四题:

一维数组定义的一般形式如下,其中的数组长度是一个整型常量表达式,给定数组的大小。

类型名 数组名[数组长度];

T

F

思路:

记住即可,数字长度只能放常量不能放变量,比方说int a=100,arr[a]={0} 是错误的。因为a是变量。

第五题:

若字符数组s1和s2中均已正确存储字符串,则可以使用 if(s1>s2) 进行两字符串大小的比较。


T

F

思路:

不能直接通过关系运算符进行比较,除非在c++里面,可以通过strcmp来比较。

第六题:

一维数组定义的一般形式如下:

类型名 数组名[数组长度];
数组元素引用的一般形式如下:

数组名[下标]
在引用数组元素时,下标的合理取值范围是[0,数组长度-1],下标不能越界。


T

F

思路:

这个大家记住即可,答案为T

第七题:

"a" 和 'a'是等价的。


T

F

思路:

第一个是字符串,第二个是字符元素

第八题:

下面描述正确的是


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 ,9


B.
3 ,11


C.
12 ,13


D.
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个就会越界。

 

 

最后,笔者能力有限,如有错误,请指出,一定改正一起进步。

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐