第四章 c++/c语言程序入门(上:理论部分)
4.1c++/c程序的基本概念
4.1.1启动函数main()
main()为默认全局启动函数,可以通过修改启动代码(汇编语言中的 call main)设置为其他启动函数
回调函数:把一个函数的函数指针放入到另一个函数中进行调用
c++/c中main()函数的标准形式应至少包括int main(){}以及int main(int argc,char** argv){}
int main(int argc,char** argv)中的argc与argv的含义分别为参数命令行的参数数目,每一条参数的字符串头指针组成的指针数组
对于 argc 与 argv 的运用
4.1.3内部名称
在c语言中,函数只分为(局部作用域(文件作用域)的static函数)以及(含有extern连接类型和global的全局作用域函数)
但在c++中允许用户在不同的作用域中定义同名的函数,以及重载函数
在连接器面前,所有的函数均为全局函数,所以为了区分各作用域中的同名不同名函数,编译器按照一定的编码规则进行了重命名
4.1.4连接规范
在使用不同的编程语言进行开发的时候,需要统一全局变量,全局常量,全局函数,数据类型的连接规范
通用的C连接规范声明:extern"C"
需要编译器支持的C++连接规范声明:extern"c++"
4.1.5变量及初始化
编译器会给未赋初值的全局变量赋初值为0
全局变量,局部变量与静态变量:全局变量是指作用域在整个程序的变量,生存时间为整个程序周期;局部变量作用域为局部作用域(单个函数等),生存周期为伴随局部作用域的生成与销毁;静态变量为局部时与局部变量的作用域相同,为全局时作用域为所处的源文件(无法越过文件),生存周期为整个程序。
4.2基本数据类型和内存映像
内存的自然对齐:基本数据类型的起始地址必须要被他们的字节大小整除
4.3类型转换
内存截断和内存越界
总结四点:
(1)不可以把基类对象直接转换为派生类对象,这样会造成内存越界
(2)对于基本类型的强制类型转换必须要区分值的截断和内存的截断的区别
(3)如果必须使用强制类型转换,必须要同时保证内存访问的安全性和转换结果的安全性
(4)如果必须使用类型转换,使用显式而非编译器的隐式,自己明白发生了什么
4.4标识符
避免使用_或__作为名称的开头,可能导致编译器的名字转换后的错误
4.5转义序列
换行和回车的区别:换行是自己程序中的输入,回车可能有其他的含义如确定等
4.6运算符
多用括号
4.7表达式
任何表达式都是有值的(有返回值)
在使用&&运算符的时候,尽量把可能为true的表达式放在前边,在使用||运算符时,尽量把可能为false的表达式放在前边,因为c++/c的条件表达式的判断采用突然猝死法:在已经可以判断表达式的返回值时便不再往后进行判断
4.8基本控制结构
顺序结构简单,慎用少用goto,但是在有需要的时候可以慎重地使用
4.9选择(判断)结构
同样,在if/else语句中需要把可能为真的条件判断置于前
浮点数的比较:abs(a-b)>c 只需要a与b的差小于一定值c便可以认为是相等,不可直接用a==b来进行浮点数是否相等的判断
指针变量与NULL进行比较,最好不要与0进行比较
4.10循环(重复)结构
c++/c最好按照先行后列的读取方式读取可以提高效率(减少换页次数)