C++变量
解释语言和编译型的语言有什么区别
解释型语言使用解释器。解释器直接读取脚本文件,并执行指定的操作
计算机执行脚本,安装解释器,解释型语言需要解释器,不需要编译
什么是运行错误,什么是编译错误
执行应用程序发生的错误是运行错误 ,例如Windows的非法访问是运行的错误
编译错误会是语法错误,在运行之前就报错
编译器的警告可以忽略吗
有些情况下,编译器发出警告,警告与错误不同之处,相关的代码行策语法正确,
能够通过编译但是有更简化的代码格式,好的编译器警告会提示修改。
解释器和编译器的区别
解释器是解释执行的bai源代码,编译器是将源代码编du译成目标代码
他们最大的zhi区别是程序运行时dao需要解释器边解释边执行,而编译器则在运行时是完全不需要的
解释器的优点是比较容易让用户实现自己跨平台的代码,比如java,php等,同一套代码可以在几乎所有的操作系统上执行,而无需根据操作系统做修改;
编译器的目的就是生成目标代码再由连接器生成可执行的机器码,这样的话需要根据不同的操作系统编制代码,虽然有像Qt这样的源代码级跨平台的编程工具库,但在不同的平台上仍然需要重新编译连接成可执行文件,但其执行效率要远远高于解释运行的程序。
链接器的作用
当链接器进行链接的时候,首先决定各个目标文件在最终可执行文件里的位置。然后访问所有目标文件的地址重定义表,对其中记录的地址进行重定向(加上一个偏移量,即该编译单元在可执行文件上的起始地址)。
然后遍历所有目标文件的未解决符号表,并且在所有的导出符号表里查找匹配的符号,并在未解决符号表中所记录的位置上填写实现地址。最后把所有的目标文件的内容写在各自的位置上,再作一些另的工作,就生成一个可执行文件。
开发的步骤
项目计划
需求开发
系统设计
#include的作用
这是一个预编译的编译命令。预处理器在调用编译器的时候运行
通过 include<> 将头文件添加到源文件
// 和/**/的区别
//尾行注释
/**/多行注释
同时脚本文件的注释是#
什么情况下需要命令行参数
需要提供让用户能够修改程序的选项,
比如,获取网络信息,查看文件目录,查看磁盘
获取root 的权限,修改用户的权限
既然可以使用常规变量代替常量,为何还要定义常量
声明常量的关键字 const 可以告诉编译器,其值是固定的,不允许修改
编译器将确保不给常量赋值,即使另外一个程序员接手工作,不小心试图
覆盖常量的值,如果知道这个值不可被改变,声明为常量
为啥要给变量 赋初值
如果不初始化,就无法知道变量包含的初始值,在这种情况下
默认的初始值,有可能会导致程序的崩溃,造成不好的结果
为何不能频繁的使用全局变量,全局变量在应用程序的任何地方
全局变量可以在程序的任何地方被调用,假如你的代码被被人使用
不小心调用了你的变量,那么代码是很不稳定的,为了程序的稳定性,
一定要想好变量的位置。
在C++中,可以声明无符号的变量,其取值只能是零或者正整数,如果一个unsigned int 变量
为0,将其减1的结果如何?
定义一个变量 有符号,和无符号,如果给无符号的变量变成负数,就会访问外部内存单元
就会出现内存溢出,是不被允许的
有符号和无符号整型的区别
无符号整型和有符号整型的区别就是无符号类型可以存放的正数范围比有符号整型中的范围大一倍,因为有符号类型将最高位储存符号,而无符号类型全都储存数字。
为啥要声明变量
使用变量去访问和使用内存,声明多个类型的相同的变量,
注意局部变量,局部变量定义和声明都在函数内部,调用只能在函数里,是不能在函数外面调用的
局部变量为什么节省内存呢,因为当函数执行结束后,会释放内存出来,也就是局部变量不在占用内存
命名的要求
驼峰命名
下划线命名
命名的约定方便程序员理解代码,团队协作时,最好统一代码的规范和风格
以便别人新增代码
变量的类型
如何选取合适类型的变量
根据不同的要求用不同的类型的变量,防止溢出的错误
定以是一个正整数,则用unsigned int
如果变量是负数,则有符号类型的变量
再比如汽车的里程表,我们一般行程都上万,那么short 类型取值范围肯定是不行的
关于变量操作的几个注意的关键字
sizeof()
cout<<"size of an int "<<sizeof(int);
auto 自动类型的推断
auto coinFlippedHeads = ture
如果使用的是自动类型不进行初始化是会报错的,
typedef 的替换变量类型
typedef unsigned int UINT
接下来UINT 等同于 unsigned int
什么是常量
常量类似于变量,只是不能够修改,与变量一样也占用内存空间,使用名称标识为其预留的
空间地址,但不能覆盖该空间的内容
const double pi =3.14;
通过 const 关键字,程序员确保数据不变,避免无意中修改了这个变量
con sterpx 定义常量表达式 类似于声明函数
consterpx double GetPi() { return 22.0/7; }
常量表达式中可以使用另一个表达式
consterpx double TwitchPi() { retutn 2* GetPi() ;}
常量表达式可以 包含if 和switch
可以导入 头文件 <cmath> 来定义常量
枚举的常量
变量有时需要有特殊的取值
要用enum 关键字来声明枚举
可以对第一个常量进行初始化,如果不初始化,默认为0
变量名的描述
给变量指定描述性名称
对变量进行初始化,并使用列表初始化来避免缩窄转换的错误
给变量名阐述变量的用途
从别人的角度想,被人能明白你的代码中的变量的含义
应该了解团队是否遵循特定的命名规则
不要有太短的变量名,不要有怪异的变量名
不要使用保留字作为变量名
为什么不能用#define来声明变量
define 只能用来定义常量和 定义 数据类型名
在宏定义中,标准C/C++中给出了两个特殊的操作符:#和##。#是用于给红参数添加双引号;##用于链接两个宏参数,既然可以连接两个宏参数,那我们就可以链接一个首字母和行号作为一个整体了!
几乎没啥用
为何要对变量进行初始化
如果不对变量进行初始化,变量的会随机分配空间,如果此时不小心被调用,结果难以想象
C++ 初始化中的缩窄转换
比如用float 来初始化int ,就会出现BUG ,但这种BUG ,但这种bug并不是每次运行都出现