变量和基本类型1
- C++算数类型
类型 | 含义 | 最小尺寸 |
---|---|---|
bool | 布尔类型 | 未定义 |
char | 字符 | 8位 |
wchar_t | 宽字符 | 16位 |
char16_t | Unicode字符 | 16位 |
char32_t | Unicode字符 | 32位 |
short | 短整型 | 16位 |
int | 整型 | 16位 |
long | 长整型 | 32位 |
long long | 长整型 | 64位 |
float | 单精度浮点 | 6位有效数字 |
double | 双精度浮点 | 10位有效数字 |
long double | 扩展精度浮点数 | 10位有效数字 |
类型转换区分:
1、把非bool型赋给bool型,初始值为0结果为false,否则结果为true。
2、把bool赋给非bool型,初始值false结果为0,为true结果为1。
3、赋给无符号类型一个超出其表示范围值时,结果是初始值对无符号类型数值总数(表示范围内数的个数)取模后的余数。如8比特的无符号可表示0~255区间内的值,如果赋予了区间外值,实际结果应该是该值对256取模后的余数。例如把-1赋给8比特的无符号类型所得结果是255。
- 对于使用if语句应注意地方
int i = 42;
if(i) //if条件的值将为true
i = 0;
if( i == 0) //if条件为false
i = 1;
if( i = 1) //if条件恒为true,此处为赋值语句,不管怎样,不会出现任何警告或错误
i = 2;
//为防止出现如上错误,一般将定值写前面
if( 1 == i) // 如果忘写一个“=”会报错
赋值与初始化辨析:
初始化不是赋值,初始化含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦出,而以一个新值来代替。c++初始化形式:
int i = 0;
int i = {0};
int i(0);
int i{0};
作为c++11标准的一部分,用花括号初始化形式称为列表初始化。当用于内置类型的变量时,这种初始化有一个重要特点:如果我们使用列表初始化且初始值存在丢失信息风险,编译器将报错:
long double ld = 3.141592654;
int a{ld}, b = {ld}; //错误,转换未执行,因为存在丢失信息风险
int c{ld}, b = ld; //正确,转换执行,且确实丢失了部分值
- 变量声明和定义
声明使得名字为程序所知,而定义负责创建与名字关联的实体。也即定义申请了存储空间,也有可能为变量赋初始值。
如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显示地初始化变量:
extern int i; //声明i而非定义
int j; //声明并定义j
//定义pi,任何包含了显示初始化的声明都成了定义,这样抵消了extern作用
extern double pi = 3.1416;
在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误。
变量只能被定义一次,但是可以被多次声明。
声明和定义区别看起来也许微不足道,但实际非常重要,如果需要在多个文件中使用同一个变量,就必须将声明和定义分离。此时,变量的定义必须出现在且只能出现在一个文件中,而其他使用该变量的文件中必须对其进行声明,却不能重复定义
- 嵌套的作用域
因为有内层作用域和外层作用域之分,但当在内部想使用外部作用域的同名变量时,该怎样用?以下用一个小程序解释区分:
#include <iostream>
using namespace std;
//该程序仅用于说明:函数内部不宜定义与全局变量同名的新变量
int reused = 42; //reused拥有全局作用域
int main()
{
int unique = 0; //块作用域
//输出: 42 0
cout<<reused<<" "<<unique<<endl;
int reused = 0; //新建局部变量,覆盖同名全局变量
//输出: 0 0
cout<<reused<<" "<<unique<<endl;
//使用作用域操作符显示访问全局变量,输出: 42 0
cout<<::reused<<" "<<unique<<endl;
return 0;
}