1.C 语言规定,在一个源程序中,main 函数的位置可以任意,不一定必须在系统调用的库函数的后面
2.指针相加没意义,相加后地址不可控,可能会破坏其他地方内容,连续存储空间,两指针相减,可求出两指针相差字节数,在数组中很常见
3.下面选项中关于位运算的叙述正确的是?
A.位运算的对象只能是整型或字符型数据
B.位运算符都需要两个操作数
C.左移运算的结果总是原操作数据2倍
D.右移运算时,高位总是补0
答案:A
B:按位取反只需要一个操作数
C:左移一位是扩大2倍,左移n为扩大为2^n倍
D:如果是正数,高位补0,如果是负数,高位补1
4.while 语句的循环体执行次数比循环条件的判断次数少 1,而 do-while语句的循环体执行次数等于循环条件的判断次数
5.对于代码段,问下面不可以表示a[1]地址的是?
int a[10];
A.&a[0] + 1
B.a + sizeof(int)
C.(int*)&a + 1
D.(int*)((char*)&a + sizeof(int))
答案:B
解题的关键是看 a 的类型和步长,要得到 a[1] 则需要 a[0] 向后移动四个字节
A:相当于整形指针加一,移动四个字节,正确
B:相当于整形指针加四,移动十六个字节,错误
C:相当于先将数组指针转化为整形指针再加一,是移动四个字节,正确
D:相当于将数组指针转化为字符指针加四移动四个字节再转化为整形指针,正确
6.gets函数是读取字符串,以回车键结束,fgets是读取一行字符,以换行符结束,getc读取一个字符,fgetc读取一个字符,读取一个字节后后移一位
单个字符输入:getchar( ) = getc( stdin ) = fgetc( stdin )
单个字符输出:putchar( ) = putc( c,stdout ) = fputc( c,stdout )
字符串行输入:gets( str) = fgets( str,stdin)
字符串行输出:puts( str) = fputs( str,stdin)
7.C语言中把标识符分为三类:关键字,预定义标识符,用户自定义标识符,标识符由字母(A-Z,a-z)、数字(0-9)、下划线“_”组成,并且首字符不能是数字,但可以是字母或者下划线
8.不考虑任何编译器优化(如:NRVO),下述代码的第10行会发生什么?
#include <stdio.h>
class B{
};
B func(const B& rhs){
return rhs;
}
int main(int argc, char **argv){
B b1, b2;
b2 = func(b1); //10
}
答案:一次拷贝构造函数,一次析构函数,一次(拷贝赋值运算符)operator=
一次拷贝构造函数发生在func函数调用完成,返回B类型的对象时,因为返回的不是引用类型,所以会生成一个对象,不妨称为TEMP,将返回的对象通过拷贝构造函数复制给TEMP,然后,返回值所对应的对象会被析构,如果返回值是引用类型,则不会调用拷贝构造函数,赋值运算符在func函数执行完成后,将上面提到的TEMP,通过赋值运算符赋值给b2,值得注意的是赋值运算符重载函数如果不自己定义,程序会认为是调用缺省的赋值运算符重载函数
9.能够在字符串“aabaaabaaaab”中匹配“aab”,而不能匹配“aaab”和“aaaab”的正则表达式为?
A.“a*?b”
B.“a{,2}b”
C.“aa??b”
D.“aaa??b”
答案:BC
?? 重复0次或1次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
*? 重复任意次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复