第一题
1. 为了避免在嵌套的条件语句if-else中产生二义性,C语言规定else子句总是与( )配对。
A:缩排位置相同的if
B:之前最近的未匹配的if配对
C:其之后最近的if
D:同一行上的if
答案及解析 B
else语句是跟最近的未匹配的if语句配对
第二题
2. 若有定义语句: int year=1009 , *p=&year ;以下不能使变量 year 增至 1010 的语句是
A:*p+=1;
B:(*p)++;
C:++(*p)
D:*p++A
答案及解析 D
A:*p += 1 等价于 *p = *p + 1;
B:(*p)++ 先解引用获得year的值再++
C:跟B同理,只不过是前置++和后置++
D:*p++ 这里++的优先级是高于*的,所以这里p++之后,到往后跳了1个整型的距离,再解引用肯定不是year,是一未知的数字;
第三题
3. 已定义ch为字符型变量,以下赋值语句中错误的是()
A:ch='\';
B:ch=62+3;
C:ch=NULL;
D:ch='\xaa';
答案及解析 A
A:错误,\把后面的'转义了,所以错误
B:正确,由于字符型变量有ASCII值,所以62+3 = 65 也就是 A字符
C:正确,NULL是由#define定义的宏,为0,是'\0'这个字符
D:正确,\xaa是一个字符,是16进制字符的表示方法,所以正确
第四题
4. 已知:char str1[8],str2[8]={"good"};,则在程序中不能将字符数组str2赋值给str1的语句是
A:str1=str2;
B:strcpy(str1,str2);
C:strncpy(str1,str2,6);
D:memcpy(str1,str2,5);
答案及解析 A
A:数组名是地址常量,不可以更改,所以不能做赋值运算符的左值,因为赋值运算符的左值必须是变量;
B:strcpy是拷贝函数,遇到\0停止,所以可以完成拷贝。
C:strncpy是我们让他拷贝几个字符就拷贝几个,题中给6个,完全够用。
D:memcpy是按照字节拷贝,char类型是一个字节,所以题中给5个字节完全够用
第五题(错了)
5. 以下程序的输出结果是:
#include<stdio.h>
int main()
{
int x = 0, y = 5, z = 3;
while(z-->0 && ++x<5)
{
y= y - 1;
}
printf("%d, %d, %d\n", x, y, z);
return 0;
}
A:2,2,0
B:3,2,-1
C:4,3,-1
D:5,-2,-5
答案及解析 B
这里需要注意的一点就是
后置--/++ 返回的是变化之前的值,这个值是变量的临时拷贝,但是变量本身是变化了。
前置--/++返回的就是变化后的变量的值。
在最后一次z == 0的时候,进入循环,虽然不满足条件,但是z--已经运算了,所以是-1