1.什么时候使用for和while循环?
一般确定循环次数使用for,不确定用while
2.
计算机都是补码形式来存储的
在学习原码,反码和补码之前, 需要先了解机器数和真值的概念。
1、机器数
一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用机器数的最高位存放符号,正数为0,负数为1。
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是0000 0011。如果是 -3 ,就是 100 00011 。
那么,这里的 0000 0011 和 1000 0011 就是机器数。
2、机器数的真值
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。
例如上面的有符号数 1000 0011,其最高位1代表负,其真正数值是 -3,而不是形式值131(1000 0011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
二. 原码, 反码, 补码的基础概念和计算方法
在探求为何机器要使用补码之前,让我们先了解原码、反码和补码的概念。对于一个数,计算机要使用一定的编码方式进行存储,原码、反码、补码是机器存储一个具体数字的编码方式。
1. 原码
原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。比如:如果是8位二进制:
[+1]原= 0000 0001
[-1]原= 1000 0001
第一位是符号位,因为第一位是符号位,所以8位二进制数的取值范围就是:(即第一位不表示值,只表示正负。)
[1111 1111 , 0111 1111]
即
[-127 , 127]
原码是人脑最容易理解和计算的表示方式。
2. 反码
反码的表示方法是:
正数的反码是其本身;
负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
[+1] = [0000 0001]原= [0000 0001]反
[-1] = [1000 0001]原= [1111 1110]反
可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值。通常要将其转换成原码再计算。
3. 补码
补码的表示方法是:
正数的补码就是其本身;
负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。(也即在反码的基础上+1)
[+1] = [0000 0001]原= [0000 0001]反= [0000 0001]补
[-1] = [1000 0001]原= [1111 1110]反= [1111 1111]补
对于负数,补码表示方式也是人脑无法直观看出其数值的。通常也需要转换成原码再计算其数值。
3.含有无符号数类型的表达式:
1.当无符号数减去一个数是要确保结果不能为负值。
二、变量
1.初始化:当对象在创建时候获得了一个特定的值,我们说这个对象被初始化了。
注意:区分初始化和赋值
int a=10;//初始化
int n;//定义变量 n=10;//赋值
2.列表初始化(C++11新特性)好处
用花括号来初始化
默认初始化
1.如果定义变量没有被指定初值,将会默认初始化,内置类型(int char等)在函数体外(全局变量)为0,函数体内(局部变量)为随机值,不被初始化。每个类各自决定其初始化对象的方式(因为每个类构造函数不同)。建议每一个内置类型都初始化
变量的声明和定义的关系
1.声明:使得名字为程序所知
2.定义:负责创建与名字关联的实体
注意:extern double p=3.154;//包含初始值变为定义了,但在函数内部,extern 初始化将报错
变量可以多次声明,但只能定义一次
3.命名规范(坚持习惯)
4.作用域(同名情况下就近原则)
全局作用符 ::
建议:如果函数有可能用到某全局变量,则不宜再定义一个同名的局部变量。
复合类型
1.引用:为对象起了另外的名字 (引用必须初始化 )只能绑定一个
注意:因为引用本身不是一个对象,所以不能定义引用的引用,但有指针的指针
2.指针:是对象,可以指向别的对象 类型必须匹配
1.
2.1空指针:不指向任何对象 int*p=nullptr;
建议:初始化所以指针
2.2.void*指针
2.2.1void*指针是一种特殊的指针类型,可以存放任意对象的地址(最常用的情况是作为函数的返回值)
建议写法:int *p1,p2; *和p1一起,定义了一个int类型的指针
2.3指向指针的指针
解引用 *p取出对应地址空间的内容
2.4指向指针的引用
2.5const限定符
2.5.1 因为const对象一旦创建后不可再修改,所以const对象必须初始化
2.5.2默认状态下,const对象仅在文件内有效,当多个文件中出现了同名的const变量时,其实等同于在不同文件中分别定义了独立的变量。
但另外情况:
如果想再多个文件之间共享const对象,在定义时候必须添加extern关键字
**const和引用 引用只能绑定一个对象
const int &rl=ci;
//rl是ci的引用,不允许通过rl来修改ci的值,即不许通过引用来修改绑定对象
系统自带产生临时变量 其实ri是temp的别名
int i=10; const int *pt=&i;
pt 是指向i的指针,但是不能通过该指针修改指定对象。但是pt指针是可以指向其他变量。
但可以通过i本身修改变量 i=100;
int *const pt=&i;
可以通过pt指针修改指向的对象,但是pt指针只能指向i不能在指向其他变量
constexpr和常量表达式
常量表达式:是指不会改变并且在编译过程就能得到计算结果的表达式
目的:是为了替换字面值常量 如 const int max_files=20;
constexpr可以坚持是否为常量表达式如:constexpr int sz=get_size(10);不是常量表达式 会报错
类型别名
传统方法 typedef 例如:typedef int age;//原来变量的位置,就变成了类型的别名 age i;
C++新标准 using age=int ;
auto类型说明符
能让编译器替代我们去分析表达式所属的类型,因此必须要有初始值。
decltype类型指示符