21.1.2 C51语言基础
1.请定义变量p,使其指向一个整型数变量。
本题考查指针变量的定义。
参考答案:int*p;
2.在定义变量或函数时,在其前面加上关键字static有什么作用?
对于这类用语言描述的题,需要考虑严谨一些。本题主要考查静态变量或静态函数的概念。参考答案:关键字static主要有以下3个作用。
❑函数体内声明为static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。
❑在模块内声明为static的全局变量可以被模块内所用函数访问,但不能被模块外其他函数访问。
❑在模块内声明为static的函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内。
3.写出以下程序的执行结果。
include<stdio.h>
void main()
{
int a,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf(“b,c,d:%d,%d,%d”,b,c,d);
return 0;
}
本题主要考查自增1的前置、后置运算结果。
参考答案:b,c,d:10,12,120
4.下面程序片断执行后,变量c的值为多少?
int a=2,b=11,c=a+b++/a++;
本题考查读者对运算符优先级的掌握程度。
参考答案:c=8
5.下面的表达式是否正确,为什么?
a=b/*p;
以上表达式初看起来是表示用b除以指针变量p所指向内存中的值,然后把计算结果赋值给变量a。但是,在C51中,编译器会将/解释为注释的开始,然后开始向后查找/。如果要达到用b除以p指向的内存的值,则可以将上述表达式修改为以下形式:
a=b/(*p);
用括号将/和*分隔开。
参考答案:该表达式不能正确编译。
6.下述程序执行后的输出结果是什么?
include<stdio.h>
void main()
{
char x=‘h’;
printf(“%c\n”,‘a'+(x-'a’+1));
}
本题考查字符串与ASCII的相关知识。
参考答案:i
7.下列代码片断是否正确,为什么?
int a[3],i;
i=a++;
参考答案:第2行代码是错误的,不能对数组名执行++运算。
8.下面列出的都是程序设计中的错误,哪一个错误在编译时不会报错。
(1)花括号不配对。
(2)复合语句中的最后一条语句后未加分号。
(3)将变量i的值改为2,写作“i==5;”。
(4)变量有引用、无定义。
分析:
❑第1种错误编译通不过,在编译时将报错,如果右花括号“}”少了,错误提示将在程序的最后。
❑第2种错误编译通不过,在编译时将报错,错误提示将出现在复合语句的右花括号位置。
❑第3种错误是逻辑错误,程序编译能通过,只是运算符“==”不是赋值符,而是逻辑比较符。
❑第4种错误编译通不过,在编译时将报错。
参考答案:第3种错误在编译时不会报错。
9.在C51中可使用‘\nnn’进行字符转义,下面转义字符中错误的是哪一个?
(1)‘\0x123’
(2)‘\12’
(3)‘\3’
(4)‘\78’
分析:转义字符的表示范围是ASCII中的字符,因此数据的表示范围为0~255,以16进制为例其表示范围则是0x00~0xFF。
参考答案:第1个转义字符的表示是错误的,超过字符集的范围了。
10.已知一个数组array,用一个宏定义,求出该数组的元素个数。
分析:数组中各元素所占内存大小是相同的,使用sizeof运算符可计算出数组占用内存的大小,再使用sizeof运算符求出一个元素占用内存的大小,即可得到元素的个数。本题考查的是sizeof运算符的运用。
参考答案:#define ARR_NUM(sizeof(array)/sizeof(array[0]))