C++Prime学习笔记之第一章

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类型指示符

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值