357-C++、Linux必备知识点

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值