1. 以下程序段的输出结果是?
char s[]="\\141\141abc\t";
printf("%d\n",strlen(s));
A. 9
B. 12
C. 13
D. 14
正确答案:
A
解析:
\算一个转义字符,代表\
1算一个字符
4算一个字符
1算一个字符
\141算一个字符
a算一个字符
b算一个字符
c算一个字符
\t算一个字符
2. 下列叙述中,错误的是?
A. 计算机不能直接执行C语言编写的源程序
B. C程序经编译后,生成的扩展名为.obg的文件是一个二进制文件
C. 扩展名为.obj的文件,经链接程序生成扩展名为.exe的文件是一个二进制文件
D. 扩展名为.obg和.exe的二进制文件都可以直接运行
正确答案:
D
解析:
用C语言解决实际问题时,从编程到运行一般要经过以下几个步骤:编写源程序形成.c结尾的文本文件;通过编译器编译,检查语法词法错误后,形成.obj结尾的目标文件;通过链接动态库,形成最终可执行的以.exe结尾的二进制文件。D选项中.obj是无法直接运行的,所以答案是D
3. 以下程序的输出为?
#include<stdio.h>
int main()
{
int i = 1;
sizeof(i++);
printf("%d\n",i);
return 0;
}
A. 1
B. 4
C. 2
D. 8
正确答案:
A
解析:
这道题,首先要知道的点在于sizeof是一个操作符,不是函数,那么其实它括号里面的内容是不会去计算的,所以这里虽然用了后置++,但是i的值是不会发生变化的,还是保持最开始的1
4. 以下叙述中正确的是?
A. 由printf输出的数据都隐含左对齐
B. scanf和printf是C语言提供的输入和输出语句
C. 赋值语句是一种执行语句,必须放在函数的可执行部分或全局区域
D. 由printf输出的数据的实际精度是由格式控制中的域宽和小数的域宽来完全决定的
正确答案:
C
解析:
printf输出的数据都隐含右对齐,所以A错
scanf和printf是C语言提供的输入输出函数,所以B错误
printf输出数据所占的宽度由系统决定,所以D错误
5. 有以下程序
#include<stdio.h>
int main()
{
int a=2,c=5;
printf("a=%%d,b=%%d\n",a,c);
}
则程序的输出结果是?
A. a=2,b=5
B. a=%2,b=%5
C. a=%d,b=%d
D. a=%%d,b=%%d
正确答案:
C
解析:
C语言中用“%%”打印输出字符“%”,所以%%d,输出为%d两个普通字符,而不是格式控制符“%d”的含义,所以打印结果为C
6. 以下程序输出结果是?
int main()
{
int m = 5;
if (m++>5)
printf("%d\n",m);
else
printf("%d\n",m--);
}
A. 7
B. 6
C. 5
D. 4
正确答案:
B
解析:
第一行给m赋值为5,第二行进行if条件的判断。因为m++是先取m的值拿来用然后m的值自增1,所以if(m++>5)printf(“%d\n”,m);首先判断if条件不成立,m值自增1后等于6,然后再执行else分支的内容,这是后置 - -,将m的值打印出来后,m再自减。故打印结果就是6
7. 已有定义“int x = 12,y = 15,z;” 则执行表达式“z = (x||(y -= x))”后,变量y和变量z的值分别为?
A. 3 , 1
B. 15 , 12
C. 3 , 12
D. 15 , 1
正确答案:
D
解析:
C语言中规定:
对于或运算而言,如果左边的表达式值为1,那么整个逻辑运算结果就是1,不会对右侧表达式进行运算了
如果左边的表达式为0,那么就需要继续看右边的表达式到底为0还是为1,这个时候右边表达式或者变量的结果,就会决定整个表达式的结果
(x||(y -= x)),这个时候x的值为真,整个表达式的结果就是真的,同时右边的表达式不会再进行任何的操作。
8. 循环语句 while (!E); 中的表达式 !E 等价于?
A. E!=0
B. E!=1
C. E==0
D. E==1
正确答案:
C
解析:
对于 while (!E) 来讲,只有E为假的时候,条件才为真,所以就等同于E==0,所以答案选C
9. 当 x=3 y=1 z=0 时,表达式 x<=y<=z 的结果为?
A. 1
B. 0
C. 3
D. 其他都不对
正确答案:
A
解析:
<=为关系运算符且它的结合性是从左到右,故上式等价于 (x<=y)<=z
又因为 x=3 y=1,所以 x<=y 的结果为0(代表假),然后 0<=z 的结果为1(代表真)
10. 下面程序执行的结果为?
int main()
{
char ch1,ch2;
ch1='D'+'8'-'3';
ch2='9'-'1';
printf("%c %d\n",ch1,ch2);
return 0;
}
A. l ‘8’
B. l 8
C. G ‘8’
D. 其他几项都不对
正确答案:
B
解析:
ch1=‘D’+‘8’-‘3’,首先数字字符的ASCII码值从0~9是依次递增的,同时相邻两个数字字符之间的ASCII码值的差值为1,那么 ‘8’-‘3’ 的值就是5。‘D’ + 5 的意思就是从字符D开始往后数5个字母,最后得到的结果就是 l,ch2=‘9’-‘1’,同时以%d的格式输出,最后得到的结果就是数字8,而不是字符8
11. 下面四个选项中,均是合法整形常量的选项是?
A. 160 -0xffff 011
B. -0xcdf 01a 0xe
C. -01 986,012 0668
D. -0x48a 2e5 0x
正确答案;
A
解析;
A中160是十进制数,-0xffff 是十六进制数,011 是八进制数,均合法
B中01a非法,因为a不是二进制数码
C中 986,012 非法,不能包含“,”,0668非法,因为8不是八进制数码
D中0x非法,因为后面没有有效的十六进制数码。
所以选A
12. 下述程序执行后的输出结果是?
#include<stdio.h>
int main()
{
int x='f';
printf("%c\n",'a'+(x-'a'+1));
return 0;
}
A. g
B. H
C. I
D. J
正确答案;
A
解析:
首先变量x的值被赋值为了字符f,那么字符f和字符a之间的差值为5,然后再进行+1的操作,可以得出结果就是6,然后字符a+6的结果就是字母a往后数6个字母,结果就是g
13. 下面代码段的输出结果为?
#define MOD(x,y) x%y
int a=13,b=94;
printf("%d\n",MOD(b,a+4);
A. 5
B. 7
C. 9
D. 11
正确答案:
B
解析:
宏替换是直接替换的,所以这里替换后应该是b%a+4,先算%后算+,也就是3+4得7。
14. *(p+2)指向哪里?
int x[6][4],(*p)[4];
p = x;
则*(p+2)指向哪里?
A. x[0][1]
B. x[0][2]
C. x[1][0]
D. x[2][0]
正确答案;
D
解析:
p是指向int[4]类型的指针,p=x,指向x的首地址。
p+2,即加上2个指向类型的大小,即 2*4=8 个int,所以*(p+2)指向x[2][0]
15. 以下程序的输出结果是?(@表示一个空格)
int main()
{
printf("s1=|%15s|s2=|%-5s|","chinabeijing","chi");
return 0;
}
A. s1=|chinabeijing@@@|s2=|chi|
B. s1=|chinabeijing@@@|s2=|chi@@|
C. s1=|@@@chinabeijing|s2=|@@chi|
D. s1=|@@@chinabeijing|s2=|chi@@|
正确答案:
D
解析:
%15s表示输出占15个空格的位置,并且右对齐,左边多余的位置补空格,因为“chinabeijing”包含12个字符,所以输出时,左边要补上3个空格,%-5s表示输出占5个空格的位置,并且左对齐,右边多余的位置补空格,因为“chi”包含3个字符,所以输出是,右边要补上2个空格。所以正确的答案是D
16. 已知有职工情况结构变量emp定义为:
struct Date
{
int year;
int month;
int day;
};
struct Employee
{
char name[20];
long code;
Date brith;
};Employee emp;
下列对emp的birth正确赋值方法是?
A. year=1980;month=5;day=1;
B. birth.year=1980;birth.month=5;birth.day=1;
C. emp.year=1980;emp.month=5;emp.day=1;
D. emp.birth.year=1980;emp.birth.month=5;emp.birth.day=1;
正确答案:
D
解析:
“Employee”定义一个变量名为emp的Employee型结构体变量,由于变量birth是属于emp中的一个数据元素,且变量birth的是Date型变量、本身也是一个结构体,故要想给变量birth中数据元素赋值,应当是使用“.”运算符,即emp.birth.year=具体数值;emp.birth.month=具体数值;emp.birth.day=具体数值;
17 . C语言中,若有int a[5]={12,34,56,78,90},*p=a;则*p++==13.
A. 正确
B. 错误
正确答案:
B
解析:
*p++相当于*(p++),因为p++先返回p的值然后再自加,所以*p++相当于*p,所以本题中*p++的值为12,而不是13
18. 若变量已正确定义,要求程序段完成求5!的计算,不能完成此操作的程序段是?
A. for(i=1,p=1;i<=5;i++) p*=i;
B. for(i=1;i<=5;i++) { p=1; p*=i; }
C. i=1;p=1;while(i<=5){ p*=i;i++; }
D. i=1;p=1;do{ p*=i; i++; }while(i<=5);
正确答案:
B
解析
每执行一次循环时,p又被赋值为1
19. 下面这段C代码的输出是?
int f(int n)
{
if(n<=1)
return 1;
if(n%2==0)
return f(n/2);
return f(n/2)+f(n/2+1);
}
int main()
{
printf("%d",f(11));
return 0;
}
A. 运行出错,栈溢出
B. 3
C. 4
D. 5
正确答案;
D
解析;
递归的诉求是将大问题拆分成更容易解决的小问题,f11最终拆为多个1的求和,如图最终为1+1+1+2得5
f0=1 f1=1 f2=f1=1 f3=f1+f2=2 f4=f2=1 f5=f2+f3=3 f6=2 f11=f5+f6=5
20. 假定s被定义为指针类型char* 的变量,初始指向的字符为“Hello world!”,若要使变量p指向s所指向的字符串,则p应定义为?
A. char*p=s
B. char*p=&s
C. char*p;p=*s
D. char*p;p=&s
正确答案:
A
解析:
B、D:指向字符串的指针,初始化赋值时,前面不需要加上取地址运算符&
s指向字符串首元素的地址,类型为char*,那么则&s的类型为char**,而指针p也为char*类型的指针,所以二者并不相等。
C:*s只能取得字符串首元素的值,并不能获取整个字符串的值