1、说一下C++和C的区别
设计思想上:
C是基于过程的结构化编程语言,C++在此之上增加了面向对象的机制
语法上:
C++具有封装、继承和多态三种特性
C++相比C,增加多许多类型安全的功能,比如强制类型转换、
C++支持范式编程,比如模板类、函数模板等
2、using namespace std;工程上用的不多?因为更耗时,常用一下三句代替:
using std::out;
using std::endl;
using std::ostream;
3、编程范式:面向过程、面向对象、函数式编程、泛型编程(STL)
4、Linux指令:
编译c源码:g++ 文件扩展名; 运行: ./ a.out; 上一层目录:../;
编辑内容:vim main.cpp; 编译待编译源码: g++ -E文件扩展名(由预处理生成)
5、 程序执行过程:c源码—》预处理—》编译—》链接—》运行
6、万能头文件(工程中需要什么就写上什么,其他的头文件不写)
7、所有预处理命令的开头都是#,而“##”起链接作用,将符号两边内容链接;
(1)宏定义 只是其中一种预处理命令,宏定义必须只占一行代码,若有多行代码需要在每行最后加上连接符“\”;
(2)条件式编译 也是一种预处理命令,
8、可执行程序的功能 由 (源代码和)待编译源码 决定;
9、使用__attribute__完成函数注册功能,可以先于主函数执行,如:
10、C++开发环境配置:
DevC++可以称为是学习环境,而不是开发环境,即便是开发环境,也需要在特定环境下配置对应的开发环境参数才能支持特定的属性,如果真用纯Windows的环境进行C/C++开发处理:
一选IDE就是Visual Studio,但是这个环境太大了
二选MinGW高版本+gcc或clang环境(推荐)
三选QT环境进行处理
四选Visual Studio Code 配合powershell等shell环境(需要详细配置)
11、printf中分别代表的输出类型:
%a(%A):浮点数、十六进制数字和p-(P-)记数法(C99)
%f:浮点数(包括float和doulbe)
%e(%E):浮点数指数输出[e-(E-)记数法]
%g(%G):浮点数不显无意义的零"0"
%i:有符号十进制整数(与%d相同)
%u:无符号十进制整数
%o:八进制整数 e.g. 0123
%x(%X):十六进制整数0f(0F) e.g. 0x1234
%p:指针
%s:字符串
%%:"%"
例如:如x=2.31913
printf("%5.2f",x)就是“ 2.32”,注意小数点也算一位数长,2前面还有一个空格!
所以5.2是指结果总长是五位数(注意小数点也算一位数长),就是小数点前两个数字,不足就用空格表示,小数点后保留两位,不足四舍五入!
12、struct字节对齐的细节和具体编译器实现相关,一般而言,满足三个准则:
1.结构体变量的首地址能够被其最宽基本类型成员的大小所整除;(编译器自己调整)
2.结构体每个成员相对于结构体首地址的偏移量都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
3.结构体的总大小为结构体大小必须是所有成员大小的整数倍(或者结构体最宽基本类型成员大小的整数倍),如有需要编译器会在最末一个成员之后加上填充字节。
总结:只需考虑后面两点。
但是,注意以下两种情况:
1. struct中嵌套union
结果:32
2. struct嵌套struct
对于嵌套的结构体,需要将其展开。对结构体求sizeof时,上述两种原则变为:
1.展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍。
2.结构体大小必须是所有成员大小的整数倍,这里所有成员计算的是展开后的成员,而不是将嵌套的结构体当做一个整体。
例: