C++ 变量和基本类型分析

第二章 变量和基本类型

2.1 基本内置类型
基本数据类型包括算术类型和空类型
算术类型包括了字符、整型数、布尔值和浮点数,空类型不对应具体的值。

2.1.1 算术类型
算术类型分为: 整型(包括字符和布尔值)和浮点型。
C++ 算术类型大小(运行在vs2013 win32平台下)
bool 布尔类型 8位
char 字符 8位
wchar_t 宽字符 16位
char16_t Unicode字符 16位
char32_t Unicode字符 32位
short 短整型 16位
int 整型 32位
long 长整型 32位
long long 长整型 64位
float 单精度浮点数 6位有效数字
double 双精度浮点数 10位有效数字
long double 扩展精度浮点数 10位有效数字
拓展
string string类对象 win32 28byte、win64 32byte
bool 的取值是 true 或 false 。
可寻址的最小内存块称为“字节”(byte),存储的基本单元称为“字”(word)。一个字节要至少能容纳机器基本字符集中的字符,字则由32或64 bit构成,也就是4或8字节。C++标准指定了一个浮点数有效位数的最小值,float以一个字(32bit),double以两个字(64bit),long double 以3或4个字(96或128bit)来表示。
字符型被分为三种:char, signed char 和 unsigned char。但表现形式只有两种:带符号型和无符号型。
注意:1.在算术表达式中不要使用 bool 和 char;
2.使用浮点数运算选用 double ,因为 float 通常精度不够而双精度浮点数和单精度浮点数的计算代价相差无几。

2.1.2 类型转换
类型转换:将对象从一种给定的类型转换为另一种相关类型。
1.把一个非布尔类型的算数值赋给布尔类型时,初值为 0 则为 flse,否则为 true 。
2.把一个布尔值赋给非布尔值, 初始值为 false 则结果为 0,初始值为 true 则结果为 1 。
3.把一个浮点数赋给整型类型时,结果仅保留浮点数中的整数部分。
4.把一个整数值赋给浮点数时小数部分记为 0 。
5.初始值对无符号类型表示数值总数取模后的余数。
#include <iostream>
int main()
{
	unsigned char a = '0';
	a = (char)(-1);
	return 0;
}

结果为255
6.赋给带符号类型一个超出表示范围的值时,结果显示未定义的。
注意:写程序时要注意可移植性,避免无法预知和依赖于实现环境的行为。
含有无符号类型的表达式中,当从无符号数中减去一个值,必须确保结果不能是一个负值。
注意:切勿混用带符号类型和无符号类型。

2.1.3 字面值常量
每一个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型。字面值要能够存放下与其关联的最大的数据类型。

字符和字符串字面值
单引号括起来的一个字符称为 char 型字面值,双引号括起来的零个或多个字符构成字符串型字面值。字符串字面值实际上是由常量字符组成的数组,每个字符串后还有一个空字符"\0",字符串实际长度为字符数量+1 。
转义序列:以反斜线"\"作为开始
换行符 \n 横向制表符 \t 报警(响铃)符 \a
回车符 \r 退格符 \d 纵向制表符 \v
表示符号 \符号
指定字面值的类型
通过添加前缀后缀可以改变整型、浮点型和字符型字面值的默认类型
L'a' //宽字符型字面值,类型是 wchar_t
u8"hi!" //utf-8 字符串字面值
42ULL //无符号长整型字面值(unsigned long long)
1E-3F //单精度浮点型字面值
3.14159L//扩展精度浮点型字面值(long double)
bool 字面值和指针字面值
true 和 false 是布尔类型的字面值,nullptr 是指针字面值。

2.2 变量
2.2.1 变量定义
类型说明符 + 一个或多个变量名组成的列表(变量名之间以逗号分隔,最后以分号结束)。
初始值:对象在创建时获取的一个特定的值。初始化与赋值不同,赋值的含义是把对象的当前值擦除,再以一个新值来代替。
列表初始化:用花括号来初始化变量。当我们使用列表初始化且初始值存在丢失信息的风险时编译器会报错。
long double id = 3.1415926536;
int a{id};//错误
int c(id), d = id;//正确,但会丢失部分信息
默认初始化:定义变量时没有指定初值,变量会被默认初始化。内置类型的变量未必显示初始化,其默认值有定义的位置决定。定义在全局的变量默认值为0,局部变量将不被初始化。
变量未被初始化会存在一个垃圾值,容易出现问题。为了程序安全,建议初始化每一个内置类型的变量。

2.2.2 变量声明和定义
声明一个变量而不将其初始化,就在变量名前添加关键字 extern,而不要显示初始化变量。在函数体内部,初始化一个被extern 修饰的变量会引发错误。变量只能被定义一次,但可以多次声明。
静态类型:在编译阶段检查类型,检查类型的过程称为类型检查。

2.2.3 标识符
C++的标识由字母、数字和下划线组成,必须以字母或下划线组成,其长度没有限制但对大小写字母敏感。
变量命名规范:标识符能体现实际含义;变量名一般用小写字母;用户自定义的类名一般以大写字母开头;标识符由多个字母组成,单词间应该有明显的区分。

2.2.4 名字的作用域
同一个名字在不同作用域可能指向不同的实体,名字的有效区域始于名字的声明语句,以声明语句所在的作用域末端为结束。建议当第一次使用变量时再定义。
#include <iostream>
using namespace std;		//作用域为整个文件
int main()
{
	int sum = 0;
	for (int i = 0; i < 10; i++)
		sum += i;
	//cout << i << endl;	//错误,i的作用域为前面的for循环,此时已经没有意义
	cout << sum << endl;	//sum 的作用域为main函数
	system("pause");
	return 0;
}

嵌套的作用域
作用域中一旦声明了某个名字,它所嵌套的所有作用域都能访问这个名字,同时允许在内层作用域中重新定义外层作用域中已有的名字。当外层作用域与内层作用域中都有定义相同名字的变量时,使用内层作用域的定义,如果要使用外层定义的加上作用域名。
#include <iostream>
using namespace std;
//函数内部不宜定义与全局变量相同的变量
int reused = 42;	//reused拥有全局作用域
int main()
{
	int unique = 0;	//unique拥有块作用域
	//输出#1:使用全局变量reused
	cout << "reused: " << reused << " unique: " << unique << endl;
	//新建局部变量reused,覆盖全局变量
	int reused = 0;
	//输出#2:使用局部变量reused
	cout << "reused: " << reused << " unique: " << unique << endl;
	//输出#3:显示使用全局变量reused
	cout << "reused: " << ::reused << " unique: " << unique << endl;
	system("pause");
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值