C++ primer学习笔记(二):变量和基本类型
数据类型是程序的基础:他告诉我们数据的意义及以我们能在数据上执行的操作。
C++语言支持广泛的数据类型,本章将主要讲述内置类型,并初步了解C++语言是如何支持更复杂数据类型的。
1.基本内置类型
C++定义了一套包括算数类型和**空类型(void)**在内的基本数据类型。
算数类型包含:字符型、整数型、布尔值和浮点数。
空类型不对应具体的值,仅用于一些特殊的场合,最常见的是当函数不返回任何值时使用空类型作为返回类型。
(1)算数类型
算数类型分为两类:整型(包括字符型和布尔类型在内)和浮点型
下表列出了C++标准规定的尺寸的最小值,同时允许编译器赋予这些类型更大的尺寸。某一类型所占的比特数不同,它所能表示的数据范围也不一样。
注:1字节 = 4 bit
浮点型可表示单精度(float)、双精度(double)和扩展精度值(long double)
除去布尔型和扩展的字符型之外,其他整形可以划分为**带符号的(signed)和无符号的(unsigned)**两种。带符号类型可以表示正数、负数或0,无符号类型则仅能表示大于等于0的值。
类型int、short、long、和long long都是带符号的,通过在这些类型名前添加unsigned就可以得到无符号类型,例如unsigned long。
类型unsigned int可以缩写为unsigned。
与其他整型不同,字符型被分为了三种:char、signed char和unsigned char。
需要特别注意的是,类型char和signed char是不一样的,类型char实际上会表现为上述两种形式的一种,具体哪种由编译器来决定。
算数类型选择经验准则:
- 当明确知晓数值不可能为负时,选用无符号类型。
- 使用int执行整数运算。在实际应用中,short常常显得太小而long一般和int有一样的尺寸。如果数值超过了int的表示范围,则选用long long
- 在算术表达式中不要选用char或bool,只有在存放字符或者布尔值时才使用他们。
- 执行浮点数运算选用double,这是因为float通常精度不够而且双精度浮点数和单精度浮点数的计算代价相差无几。long double在一般情况下是没有必要的,而且他带来的运行时消耗也很大。
(2)类型转换
对象的类型定义了对象能包含的数据和能参与的运算,其中一种运算被大多数类型支持,就是将对象从一种给定的类型转换为另一种相关类型。
当在程序的某处我们使用了一种类型而其实对象应该取另一种类型时,程序会自动进行类型转换。
类型所能表示的值的范围决定了转换的过程:
- 当我们把一个非布尔类型的算数值赋给布尔类型时,初始值为0则结果为false,否则结果为true。
- 当我们把一个布尔值赋给非布尔类型时,初始值为false则结果为0,初始值为true则结果为1。
- 当我们把一个浮点数赋给整数类型时,进行了近似处理。结果值将仅保留浮点数中小数点之前的部分。
- 当我们把一个整数值赋给浮点类型时,小数部分记为0。如果该整数所占的空间超过了浮点型的容量,精度可能有损失。
- 当我们赋给无符号类型一个超过他表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。
- 当我们赋给带符号类型一个超出他表示范围的值时,结果是未定义的,此时,程序可能继续工作、可能崩溃、也可能生成垃圾数据。
建议:避免无法预知和依赖于实现环境的行为。
含有无符号类型的表达式
无符号数不会小于0这一事实也同样关系着循环的写法
for (unsigned u = 10 ; u >= 0 ; --u)
std::cout << u << std::endl;
错误:变量u永远也不会小于0,循环条件一直成立,当u=0时,- -u的结果将会是4294967295
一种解决的方法是,用while语句来代替for语句,因为while语句让我们能够在输出变量前(而非之后)先减去1
unsigned u = 11; //确定要输出的最大数,从比他大1的数开始
while (u > 0){
--u; //先减1,这样最后一次迭代的时候就会输出0
std::cout << u << std::endl;
}
提示:切勿混用带符号类型和无符号类型
(3)字面值常量
一个形如42的值被称作字面值常量。每个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型。
整型字面值
我们可以将整型字面值写作十进制数、八进制数或十六进制数的形式。以0开头的整数代表八进制数,以0x或0X开头的代表十六进制数。例如,我们能用下面的任意一种形式来表示数值20:20(十进制)、024(八进制)、0x14(十六进制)
整型字面值具体的数据类型由它的值和符号决定,默认为 int 或 long 类型。
- 在数值后面加 L 或者 l 指定常量为 long 类型。(定义长整型时,应该使用大写字母 L。小写字母 l 很容易和数值 1 混淆。)
- 在数值后面加 U 或 u 定义 unsigned 类型。
- 同时加 L 和 U 就能够得到 unsigned long 类型的字面值常量。
浮点型字面值
浮点型字面值默认是一个double
- 在数值的后面加上f或F表示单精度
字符和字符串字面值
由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值。
- 字符串字面值的类型实际上是由常量字符构成的数组。为了兼容 C 语言,C++ 中所有的字符串字面值都由编译器自动在末尾添加一个空字符( ‘\0’),因此字符串字面值的实际长度要比它的内容多一位。
- 如果两个字符串字面值位置紧邻且仅由空格、缩进和换行符分隔,则它们实际上是一个整体。
转义序列
有两类字符程序员不可直接使用:
- 一类是不可打印的字符,如退格或其他控制字符,因为他们没有可视的图符;
- 一类是在C++语言中有特殊含义的字符(单引号、双引号、问号、反斜线)。
在这些情况下需要用到转义序列,转义序列均以反斜线作为开始,包括:
2.变量
变量提供一个具名的、可供程序操作的存储空间。C++中的每个变量都有其数据类型,决定了该变量的所占空间、布局方式、储存值的范围等。对C++程序员来说,“变量”和“对象”一般可以互换使用。
(1)变量定义
变量定义的基本形式:类型说明符+一个或多个变量名组成的列表(其中变量名以逗号分隔)+分号结束
定义时还可以为一个或多个变量赋初值。
int sum = 0 , value ,
units_sold = 0;
std::string title;
Sales_item curr_book;
类型说明符指定与对象相关联的类型:int 、