1.int a=4,则对于表达式++(a++)的结果为?
答案:不是5!编译不通过,a++的结果为4,++4是不正确的,4是右值,如果改成++(b = a++);结果就是5了
2.若变量a是int类型,并执行了语句a=’A’+1.6;则正确的结果是?
a的值是字符’A’的ASCⅡ值加上1
3.decltype和auto都可以用来推断类型,但是二者有几处明显的差异
1.auto忽略顶层const,decltype保留顶层const
2.对引用操作,auto推断出原有类型,decltype推断出引用
3.对解引用操作,auto推断出原有类型,decltype推断出引用
4.auto推断时会实际执行,decltype不会执行,只做分析。总之在使用中过程中和const、引用和指针结合时需要特别小心
4.在C语言中使用malloc时不需要强制类型转换,因为在C中从void到其他类型的指针是自动隐式转换的
在C++中是不支持void类型隐式转换为其他类型的,所以使用malloc时必须要强制类型转换,否则会报错,但在C++中一般用new而不用malloc
5.预处理指令
A:预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置
B:源文件的每一行只能有一条预处理命令,如果指令一行放不下,可以通过反斜杠“/”进行控制
C:宏名通常由大写字母表示,而不是必须要由大写字母表示
D:宏替换不占用程序运行时间,宏是在预编译期间进行的,将代码中的指定字符转换,转换结束后,再进行编译,所以不占用程序运行时间
6.scanf 会自动忽视换行符与空格,所以再输入两个数据时,输入完一个数据可以点击空格或者换行,然后输入另一个数据
7.以下定义错误的是?
A.struct A{A _a;};
B.struct A{A* _a;};
C.struct A{A& _a;};
D.struct B;
struct A{B& _b;};
struct B{A& _a;};
答案:A
struct成员类型不可以是它自己,因为会递归定义,结构体在完成定义之前是incomplete type(不完全类型),不完全类型不能定义对象,只能定义引用和指针,或者用于声明函数的形参和返回值类型
8.对于栈中内存如果没有初始化,则会出现“烫烫烫烫烫烫”。对于堆中内存如果没有初始化,则会出现“屯屯屯屯屯”
9.不同系统下基本类型的大小
10.EOF的值等于-1而不是0,因为在文本文件中数据都是以字符的 ASCII 代码值的形式存放。我们知道, ASCII 代码值的范围是 0~255 ,不可能出现 -1 ,因此可以用 EOF 作为文件结束标志
11.EOF是在C标准函数库中定义的而不是在库函数文件中定义的符号常量,EOF标识文件结束符(end of file)
12.C语言中保留字就是关键字的意思
13.程序进行编译时,不会为形参分配存储空间
14…外部变量可以供其所在的程序文件中的任何函数使用,这句话正确吗?
答案:错误
外部变量也就是全局变量,作用域是从定义的位置开始到到文件结束,而不是整个文件
**15.必须作为类成员重载的运算符:①= :赋值运算符 ②( ):函数调用运算符 ③[ ]:下标运算符 ④->:通过指针访问类成员的运算符 **
16.scanf(“%2d%d%1f”,&x,&y,&z);只能获取x的值,y和z的值都获取不了,但是不会报错,打印出来是一堆随机值*
*17.scanf(“%x%d%o”,&x,&y); * 放在%与格式d(或者s,c等)之间代表 * 是scanf函数中的一种修饰符,表示忽略该输入项
18.static类型的变量会被分配到数据区的静态存储区中
19.printf也是可以作为合法的用户自定义标识符的,前提是不引用头文件<stdio.h>
20.ASCII码
标准ASCII只使用7个bit,扩展的ASCII使用8个bit
ANSI通常使用 0x00~0x7f 范围的1 个字节来表示 1 个英文字符,即ASCII码
ASCII码包含一些特殊空字符
21.不同类型运算时以高精度的为准
22.只有简单算法才能在有限的操作步骤之后结束,这句话对吗?
错误,不管是简单算法还是复杂算法都可以在有限的操作步骤之后结束,这是算法的有穷性
23.宏和函数的区别
1.宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型
2.宏的参数替换是不经计算而直接处理的,而函数调用是将实参的值传递给形参,既然说是值,自然是计算得来的
3.宏在编译之前进行,即先用宏体替换宏名,然后再编译的,而函数显然是编译之后,在执行的时候才调用的,因此,宏占用的是编译的时间,而函数占用的是执行时的时间
4.宏的参数是不占内存空间的,而函数的形参是占用内存空间的,因为只是做字符串的替换,而函数调用时的参数传递则是具体变量之间的信息传递,形参作为函数的局部变量,显然是占用内存的
5.函数的调用是需要付出一定的时空开销的,而宏是没有的,因为系统在调用函数时,要保留现场,然后转入被调用函数去执行,调用完,再返回主调函数,此时再恢复现场,这些操作,显然在宏中是没有的
24.内联函数与宏的区别
1.内联函数在运行时可调试,而宏定义不可以
2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会
3.内联函数可以访问类的成员变量,宏定义则不能
4.在类中声明同时定义的成员函数,自动转化为内联函数
25.float 类型(即 IEEE754 单精度浮点数格式)能表示的最大整数是多少?
答案:2^ 128-2^ 104
32位=1位符号位+8位指数位+23位小数位
指数范围-128至127,小数位23位,则最大数为1.11111111111111111111111*2^ 127=(2-2^ -23)*2^ 127=2^ 128-2^ 104
26.定义下面的宏,则DECLARE(val, int)替换结果为?
#define DECLARE(name, type) type name##_##type##_type
答案:int val_int_type
##是一种分隔连接方式,它的作用是先分隔,然后进行强制连接
所以预处理器会把name## _ ##type## _ type解释成4段:“name”、“_”、“type”以及“_type”,name和type会被替换,而_type不会被替换
27.sizeof(i++);会对i进行后置++操作吗?
不会,sizeof是一个在编译时就起效果的运算符,在其内的任何运算都没有意义,sizeof(i++);在编译的时候被翻译成 sizeof((i++的数据类型))也就是 sizeof(int);不会再执行i++了,简而言之,sizeof括号里面的表达式是不参与运算的
28.有转义字符如下:‘\0X41’、‘\0x41’、‘\X41’、‘\x41’、‘\a’、‘\b’、‘\c’、'\r’其中错误的转义字符是?
答案:‘\0X41’、‘\0x41’、‘\X41’、‘\c’
\0oo: 八进制值(oo必须是有效的八进制数,即每个o可表示0~7中的一个数)
\xhh: 十六进制值(hh必须是有效的十六进制数,即每个h可表示0~f中的一个数)
转义字符以\开始
如果以\开头,后面接八进制数,对\开头的,后面可以接三位数据,即\xxx(后三位均为数),最大值为\177
还有其他几个常见的转义字符:\a,\b,\n,\v,\f,\t,\r
如果是\x(注意是小写,C语言是区分大小写的)开头,后面接16进制数,\x开头的 ,只能是\xxx(后面两位表数据)这种格式的,意思是只能接两位数据,最大值为\xff
29.在函数调用过程中,如果函数funA调用了函数funB,函数funB又调用了函数funA,则称为函数的间接递归调用,如果函数funA直接调用funA,则称为函数的直接调用
30.含有纯虚函数的类称为抽象类,抽象类不能被实例化,但是能作为指针或引用指向派生类的对象或函数,使用纯虚函数的意义是在很多情况下,基类本身生成对象是不合情理的
31.int arr[5] = {};和int arr[5] = {0};两条语句是等效的,所有元素的值都为0
32.在C语言中,引用数组元素时,其数组下标的数据类型允许是整型常量、整型变量、整型表达式
33.可以使用scanf(“%d”, p);向内存申请到的内存空间(int p = (int )malloc(sizeof(int));)中存入整数123**
p是int指针类型,scanf要求%d相应参数也是int的指针类型,所以直接就是p,或者理解成scanf(“%d”, &*p);也行
34.无符号号整数和有符号整数相加,有符号整数隐式转化为无符号整数
35.若有宏定义:#define S(a,b) t=a;a=b;b=t由于变量 t 没定义,所以此宏定义是错误的。请问这句话的说法是正确的吗?
答案:错
宏定义不作类型检查
36.使用内联函数可以加快程序的执行速度,也可能减小可执行文件的大小,因为当只有一个地方调用了内联函数时,编译器会在调用处将内联函数展开,这样就少了函数的跳转指令,栈的扩展指令,因此可能减小文件的大小
37.const和define的区别
define:
①在预处理阶段展开
②没有类型区别,不做任何类型检查
③宏仅仅是展开,不会分配内存
const:
①在编译阶段使用
②有类型区别,在编译阶段会执行类型检查
③const常量会分配内存
38.printf的返回值为输出的字符长度(不包括后面的’\0’,相当于strlen),错误返回负值
39.文件指针指向的是一块内存区域,这块区域存储着打开的文件的相关信息,包括文件读取指针当前位置、文件读取缓冲区大小等信息
40.fscanf是从文件中格式化读取,fprintf才是向文件中格式化写入
41.引用传的是值,指针传的是地址,这句话对吗?
错,引用也是传递的地址,否则你在函数内部操作的就不可能改变实参的值
42.下面程序会打印出数组ar的所有元素的值
int main()
{
int ar[] = [1,2,3,4,5,6,7,8,9];
for(auto x:ar)
{
cout << x << endl;
}
}
对于自定义类型来说,通常写成for(auto &x:ar)