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]))