
1.4 基本数据类型和变量
使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当创建一个变量时,就会在内存中保留一些空间。操作系统会根据变量的数据类型来分配内存和决定在保留内存中存储什么。
· 1.4.1 基本的内置类型
C++为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。表1-2所示为6种基本的C++数据类型。
表1-2 C++中的基本数据类型和描述
类型 |
关键字 |
描述 |
布尔型 |
bool |
值为 true 或 false |
字符型 |
char |
通常是一个字符(8位)。字符通过一个整数类型来存储 |
整型 |
int |
没有小数部分的数字 |
单精度浮点型 |
float |
1位符号(表明正负),8位指数(用于存储科学记数法中的指数部分),23位小数(用于存储尾数部分) |
双精度浮点型 |
double |
1位符号,11位指数,52位小数 |
无类型 |
void |
表示类型的缺失 |
表1-3所示为各种数据类型在内存中存储值时需要占用的内存空间和所能存储的值的范围。
表1-3 各种数据类型、占用的内存空间和范围
变量类型 |
占用内存空间(B) |
范围 |
char |
1 |
−128~127或者0~255 |
unsigned char |
1 |
0~255 |
signed char |
1 |
-128~127 |
int |
4 |
−2147483648~2147483647 |
unsigned int |
4 |
0~4294967295 |
signed int |
4 |
−2147483648~2147483647 |
short int |
2 |
−32768~32767 |
unsigned short int |
2 |
0~65535 |
signed short int |
2 |
-32768~32767 |
long int |
8 |
−9223372036854775808~ 9223372036854775807 |
signed long int |
8 |
−9223372036854775808 ~ 9223372036854775807 |
unsigned long int |
8 |
0~18446744073709551615 |
float |
4 |
1.2e-38~3.4e38 (精度为6~7 位有效数字) |
double |
8 |
2.3e-308~1.7e308 (精度为15~16 位有效数字) |
long double |
16 |
3.4e-4932~1.1e4932 (精度为18~19位有效数字) |
· 1.4.2 变量的声明和初始化
变量的声明就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。变量的声明指定一个数据类型,并包含该类型的一个或多个变量的列表,具体如下。
int i, j, k;
char c, ch;
float f, salary;
double d;
“int i, j, k;”声明了变量 i、j 和 k,指示编译器创建名为i、j、k的类型为int的变量。
变量可以在声明的时候被初始化(指定一个初始值)。初始化器由一个等号和一个常量表达式组成,具体如下。
int d = 3, f = 5; // 声明并初始化 d 和 f
char x = 'x'; // 变量 x 的值为 'x'
不带初始化的声明:带有静态存储持续时间(static)的变量(全局变量)会被隐式初始化为 NULL(所有字节的值都是0),其他所有变量的初始值是未定义的。
· 1.4.3 变量作用域
变量作用域是程序的一个区域,一般来说有3个地方可以声明变量:在函数或一个代码块内部声明变量(称为局部变量);在函数参数的定义中声明变量(称为形式参数);在所有函数外部声明变量(称为全局变量)。后文会学习什么是函数和参数(见1.8节),这里先讲解何谓局部变量和全局变量。
█ 1.局部变量
在函数或一个代码块内部声明的变量称为局部变量。它们只能被函数内部或者代码块内部的语句使用。例1-2使用了局部变量。
例1-2:局部变量。
#include <iostream>
using namespace std;
int main ()
{
// 局部变量声明
int a, b;
int c;
// 变量初始化
a = 10;
b = 20;
c = a + b;
cout << c;
return 0;
}
例1-2运行结果如图1-17所示。
图1-17 例1-2运行结果
█ 2.全局变量
在所有函数外部声明的变量(通常是在程序的开始)称为全局变量。全局变量的值在程序的整个生命周期内都是有效的。全局变量可以被任何函数访问。也就是说,全局变量一旦声明,在整个程序中都是可用的。例1-3使用了全局变量和局部变量。
例1-3:全局变量和局部变量。
#include <iostream>
using namespace std;
// 全局变量声明
int g;
int main ()
{
// 局部变量声明
int a, b;
// 变量初始化
a = 10;
b = 20;
g = a + b;
cout << g;
return 0;
}
例1-3运行结果如图1-18所示。
在程序中,局部变量和全局变量的名称可以相同,但是在函数内局部变量的值会覆盖全局变量的值,见例1-4。
例1-4:局部变量覆盖全局变量。
#include <iostream>
using namespace std;
// 全局变量声明
int g = 20;
int main ()
{
// 局部变量声明
int g = 10;
cout << g;
return 0;
}
例1-4运行结果如图1-19所示。
图1-18 例1-3运行结果
图1-19 例1-4运行结果
· 1.4.4 常量定义
C++定义常量有以下两种方式。
● #define宏常量: #define 常量名 常量值。通常在代码段前部定义,表示一个常量。
● const修饰的变量:const 数据类型 常量名 = 常量值。通常在某个变量前加关键字const,修饰该变量为常量,使之不可修改,见例1-5。
例1-5:常量定义。
#include<iostream>
using namespace std;
//宏常量
#define day 7
int main() {
cout << "一周里总共有 " << day << " 天" << endl;
//day = 8; //报错,宏常量不可以修改
//加const修饰变量后,该变量变成常量,不可修改
const int month = 12;
cout << "一年里总共有 " << month << " 个月" << endl;
//month = 24; //报错,常量是不可以修改的
return 0;
}
例1-5运行结果如图1-20所示。
图1-20 例1-5运行结果
二者的区别是const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。