C++ Primer : 第二章:变量和基本类型(1)

变量和基本类型之第一篇:基本内置类型和变量

一、

(1)

C++定义了一套包括算数类型和空类型,这些类型有:布尔类型bool,字符类型char,宽字符类型wchar_t,Unicode字符char16_t,Unicode字符char32_t,短整型short(int),

整形int,长整形long(int),长整形long long(int),单精度浮点型float,双精度浮点型double,扩展精度浮点数long double。

其中,wchar_t、char16_t、char32_t用于扩展字符集。wchar_t确保可以存放机器最大扩展字符集中的任意一个字符,类型char16_t和char32_t则为Unicode字符集服务(Unicode是用于表示所有自然语言中字符的标准)。

对于整形,C++语言规定:一个int至少应该和short int一样大,一个long应该至少和int一样大(在32位的机器上两者通常是一样大的),一个long long int至少和一个long一样大(long long int 是在C++ 11中新定义的)。

内置类型的机器实现:

计算机以比特序列存储数据,每个比特非0即1。大多数计算机以2的整数次幂个比特作为块来处理内存,可寻址的最小内存块称为"字节(byte)",存储的基本单元称为"字(word)",通常有几个字节组成。C++中,一个字要至少能容纳机器基本字符集中的字符。大多数机器的字节由8个比特组成,字则由4个字节或8个字节组成。计算机将内存中的每个字节与一个数字(地址)关联起来。

浮点型可表示单精度、双精度和扩展精度值,C++标准定义了一个浮点数的有效位数的最小值。通常,float以1个字节(32byte)来表示,double以两个字来表示,long double以3个或4个字来表示。float和double分别有7个和16个有效位。

(2)类型转换

把其他类型的值转换为bool值的时候,当值为0时bool为false,当值不为0时bool等于true;把一个bool值转换为整型时,true被翻译为1,false被翻译为0;把浮点数赋值给整形时,仅保留小数点之前的值;把一个整型值赋值给浮点型时,小数部分记0;当给一个无符号类型赋值一个超出它表示的类型时,结果是初始值对无符号类型表示数值总数取模后的余数。例如,unsigned char可以表示0~255区间的值,如果把-1赋值给一个unsigned char类型变量,则实际的结果时该值对256取模后的余数,为255。

例如:

unsigned u = 10;
int i = 42; // 输出84
std::cout << i + i << std::endl; // 如果int占32位,输出4294968264
std::cout << u + i << std::endl;

在第一个输出表达式里,两个负整数类型一样,相加得到了期望的结果,而第二个表达式在相加前,先把整型-42转换为无符号数,把负数转换成无符号数结果等于这个负数加上这个无符号数的模。

另外,当从无符号数中减去一个值时,不管这个值是不是无符号数,我们都必须保证结果是一个无符号数。

二、字面值常量

每个字面值常量都对应了一种数据类型。

这三个数分别用十进制、八进制和十六进制来表示了整型字面值常量20:

20  /* 十进制 */        024  /* 八进制 */   0x14    /* 十六进制 */

对于浮点型字面值常量,默认为double型。

'a'
/* 字符字面值 */

"a"
/* 字符串字面值 */

字符串字面值的类型实际上是由常量字符构成的数组,字符串由'\0'结尾,因此数组的长度也要至少比字符串字面值的长度大1。

std::cout << "hello world"
"I love you"
<< std::endl;

另外,字符串字面值可以分多行书写,如果两个字符串字面值位置紧邻且仅有空格、缩进和换行符分隔,则它们实际上是一个整体。

我们还可以指定字面值类型,比如:L‘a’  /* 宽字符字面值 */

三、变量

C++在定义变量时赋值叫初始化,在定义之后再赋值才算真正的赋值,所以赋值和初始化并不一样。初始化的含义是创建变量是赋予其一个初始值,而赋值的含义是把对象的当前的值擦除,用一个新值来替代。

C++初始化方式:

inthello
=0;

inthello
={0};

int hello(0);

int hello{0};

最后一种是C++11的新标准,列表初始化。

默认初始化:

定义在函数内部、块内部的内置变量,不予以默认初始化,定义在全局中的变量被默认初始化为0。

变量可以声明多次,但只能被定义一次。

extern int i;     // 声明i而非定义i

int j;// 声明j并定义j

通常,我们在第一次使用变量的地方再定义它是一种比较好的选择。

上一篇:netcore 控制台中文乱码


下一篇:再读《C++ Primer》——变量和基本类型