C++primer笔记 变量和基本类型(一)

1-基本内置类型

  • char类型, 应该确保可以存放机器基本字符集中任意字符对应的数字值。
  • floatdouble分别有7和16个有效位(long double根据硬件,和需求不同,精度不同)。
  • 字符型分为三种:char,signed char,unsigned char

选择类型的经验:
1. 明确数值不为负,选择无符号类型。
2. 使用int不使用short。
3. 浮点运算用double,不用float(计算代价相差无几)。

类型转换

bool b = 42;  //b为true
int i = b;   //i的值为1

unsigned char c = -1;  //假设char占8bit,c的值为225
    - 赋值给无符号类型一个超出它表示范围的值时,  
      结果时初始值对无符号类型表示数值总数取模的余数。 -1%256=255
    - 负数b对a取摸,在b上加a,知道b变为正数,再用这个正数对a取摸。
    - 取摸方法: 1. 求整数商 c=a/b 2.得余数r=a-c*b   
    - ps: c++中取摸同取余, python中是真正的取摸

一个算数表达式中既有无符号数又有int时,int值转换为无符号数。把负数抓换为无符号数结果等于这个负数加上无符号数的模。切勿混用带符号类型和有符号类型。

字面值常量

0开头的整数代表八进制,0x0X开头代表十六进制。八进制和十六进制字面值可以使带符号的。short类型没有对应字面值。默认的浮点类型字面值是double

字符和字符串 如果两个相邻的字符串字面值仅由空格,缩进和换行符分割,他们实际是一个整体。

转义序列 形式:\x后面紧跟一个或者多个十六进制数字,\后紧跟1-3个八进制数字。无十进制转义序列。

使用前缀或者后缀,可以改变字面值的默认类型(p37 表2.2)。nullptr是指针字面值。


2-变量

std::string代表string是在命名空间std中定义的。

在C++中,初始化和赋值是两个概念。初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,以一个新值代替。

  • 列表初始化 初始值存在丢失风险是,编译器报错
    int a = {0};
    int a{0};
  • 一般初始化?
    int a(0); int a = 0;
  • 默认初始化 定义于任何函数之外的变量被初始化为0。定义于函数内部的内置类型将不被初始化。

分离式编译

C++将声明和定义区分开来。__声明__使名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对呢个名字的生命。__定义__负责创建与名字相关联的实体。

如果想声明一个变量而非定义它,在变量名前面添加关键字extern,而且不要显式初始化。

    extern int i; //声明而非定义
    int j;        //声明且定义, 默认初始化为0

如果多个文件中包含同一个变量,必须将声明和定义分离。声明可以多次,但定义必须只能有一次。

标识符规范

用户自定义的标识符中不能出现连续两个下划线的情况,也不能以下划线紧接着大写字母开头。定义在函数体外的标识符不能以下划线开头。

  • 变量名一般用小写字母, 自定义类名一般以大写字母开头。

名字的作用域

C++大多数作用域以花括号分隔。名字的作用域始于声明的语句,名字所在作用域末端结束。


3-复合类型

引用

引用,为对象起了另一个名字。引用必须被初始化。 程序把引用和它的初值__绑定__在一起,而不是拷贝. 无法让引用重新绑定到另一个对象,因此必须被初始化. (引用被使用的情况,后续汇总)::

引用必须绑定在对象上,不能与字面值或者某个表达式的计算结果绑定在一起. (2.4.1相熟原因)

指针

__空指针__不得到任何对象, 得到空指针的方法就是用字面值nullptr来初始化指针.

    int *p1 = nullptr; // 等价于 int *p1 = 0; int *p1 =NULL;
    int zero = 0; p1 = zero; //错误: 不能讲int变量直接赋值给指针.

如果两个指针存放的地址值相同,则他们相等.

void* 指针

void*可以用来存放人以对象的地址. 它用法比较有限: 和其它指针比较,作为函数的输入输出,复制给另一个void指针. 不能直接操作void*指针所指对象,因为我们并不知道这个对象时什么类型(19.1.1).从void*的角度来看,内存空间仅仅是内存空间,没办法访问到空间内的对象.

复合类型声明

    int *p1, p2; //p1是指针, p2p2时int
    int *p; int* p;
    //推荐给将*或者&与变量名连在一起.

指向指针的引用

引用本身不是一个对象,所以没有指向指针的引用.

  int *p;
  int *&r = p; //r是一个对指针p的引用

要理解r的类型究竟是什么,最简单的方法时从右向左阅读r的定义. 距离变量名最近的符号对变量类型有最直接的影响.

面对一条复杂的声明时,从右向左,从内向外的阅读有助于理解真实含义. 就近原则?

猜你喜欢

转载自blog.csdn.net/qq_40570025/article/details/83053480