C++primer 思维导图 第二章变量和基本内置类型

概览

内容有点多,所以把导图拆开方便阅读。

小节完整版请拖至小节末尾;
本章完整版请拖至文章末尾。
变量和基本类型

2.1 基本内置类型

2.1.1基本数据类型

基本数据类型

类型含义大小
bool布尔类型未定义
char字符8位
wchar_t宽字符16位
char16_tUnicode字符16位
char32_tUnicode字符32位
short短整型16位
int整型16位
long长整型32位
long long长整型64位
float单精度浮点数6位有效数字
double双精度浮点数10位有效数字
long double扩展精度浮点数10位有效数字
表2.1   C++:算数类型

Tips1:如何选择类型
关于如何选择类型的一些准则

  • 知道数据不可能为负的情况,用unsigned。
  • 若int范围不够用,跳过long(long一般和int有一样的尺寸),直接选用long long。
  • 在算数表达式中不要使用char或者bool,只有在存放字符或布尔值时才使用它们。因为不同机器对char是有符号还是无符号的解释可能不一样。若有需要,请使用signed char或者unsigned char。
  • 浮点数直接用double,没必要用float(float精度不够,而且双精度浮点数和单精度浮点数的计算代价相差无几)。

2.1.2类型转换

类型转换
Tips2:避免无法预知和依赖于环境的行为
  无法预知的行为源于编辑器无需(有时是不能)检测的错误。即使代码编译通过了,如果程序执行了一条未定义的表达式,仍有可能产生错误。
  不幸的是,在某些情况和/或某些编译器下,含有无法预知行为的程序也能正确执行。但我们无法保证同样一个程序在别的编译器下也能正常工作,针织已经编译通过的代码再次执行也可能会出错。此外,也不能认为这样的程序对一组输入有效,对另一组就一定有效。
  程序也应该尽量避免依赖于实现环境的行为。如果我们把int尺寸看成是一个确定不变的已知值,那么这样的程序就称作不可移植的(nonportable)。当程序移植道别的机器上后,依赖于实现环境的程序就有可能发生那个错误。要从过去的代码中定位这类错误可不是一件轻松愉快的工作。

2.1.3字面值常量

字面值常量

字符和字符串字面值
前缀含义类型
uUnicode16字符char16_t
UUnicode32字符char32_t
L宽字符wchat_t
u8UTF-8(仅用于字符串字面常量)char
整型字面值
后缀最小匹配类型
u or Uunsigned
l or Llong
ll or LLlong long
浮点型字面值
后缀类型
f or Ffloat
l or Llong double
表2.2 指定字面值的类型

 
 
 

小节完整导图

基本内置类型

2.2 变量和基本类型

2.2.1变量定义

变量定义
Tips3 未初始化变量引发运行时故障
  未初始化的变量含有一个不确定的值,使用未初始化变量的值是一种错误的编程行为并且很难调试。尽管大多数编译器都能对一部分使用未初始化变量的行为提出警告,但严格来说,编译器并未被要求检查此类错误。
  使用未初始化的变量将带来无法预计的后果。有时我们足够幸运,一访问此类对象程序就崩溃并报错,此时只要找到崩溃的位置就很容易发现变量没被初始化的问题。另外一些时候,程序会一直执行完并产生错误的结果。更糟糕的情况是,程序结果时对时错、无法把握。而且,往无关的位置添加代码还会导致我们误以为程序对了,其实结果仍旧有错。
  建议初始化每一个内置类型的变量。虽然并非必须这么做,但如果我们不能确保初始化后程序安全,那么这么做不失为一种简单可靠的方法。

2.2.2变量定义和声明的关系

变量定义和声明的关系
关键概念:静态类型
  C+是一种 静态类型(statically typed) 语言,其含义是在编译阶段检查类型。其中,检查类型的过程称为类型检查(type checking)
  我们已经知道,对象的类型决定了对象所能参与的运算。在C++语言中,编译器负责检查数据类型是否支持要执行的运算,如果试图执行类型不支持的运算,编译器将报错并且不会生成可执行文件。
  程序越复杂,静态类型检查越有助于发现问题。然而,前提是编译器必须知道每个实体对象的类型,这就要求我们在使用某个变量之前必须声明其类型。

2.2.3标识符

标识符
在这里插入图片描述

2.2.4名字的作用域

在这里插入图片描述

#include<iostream>
using namespace std;
//该程序仅用于说明:函数内部不宜定义与全局变量同名的新变量
int reused=42;//resused拥有全局作用域
int main()
{
	int unique = 0;   //unique拥有块作用域
	//输出#1:使用全局变量reused;输出 42 0
	cout << reused << " " << unique << endl;
	int reused = 0;//新建局部变量reused,覆盖了全局变量reused
	//输出#2:使用局部变量reused;输出 0 0
	cout << reused << " " << unique << endl;
	//输出#3:显式访问全局变量reused;输出 42 0
	cout <<:: reused << " " << unique << endl;
	return 0;
}

 
 
 

小节完整导图

小节完整导图

2.3复合类型

待更新

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值