第2章变量和基本类型
C++语言支持广泛的数据类型。它定义了几种基本内置类型(如字符、整型、浮点数等),同时也为程序员提供了自定义数据类型的机制。基于此,C++标准库定义了一些更加复杂的数据类型,比如可变长字符串和向量等(string)。本章主要讲内置类型。
2.1基本内置类型
类型决定了数据所占的比特数以及该如何解释这些比特内容。
算术类型:整型、浮点型
C++只规定了算术类型的最小尺寸,在不同系统环境中尺寸也不一样。但原则是
一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long 至少和一个long一样大,其中long long是C++11中新定义的
布尔类型(bool):ture false
字符类型:char 大小和一个机器字节一样
除去布尔型和扩展的字符型之外,其他整型可以划分为带符号的(signed)和无符号的(unsigned)两种。int、short、long、 long long都是带符号的,通过在前添加unsigned得到无符号类型。
整型被划分成了三种:char、signed char、unsigned char。
选择类型tips
1.当明确知晓数值不可能为负时,选用无符号类型。
2.使用int执行整数运算。
3.执行浮点型运算选用double
2.1.2类型转换
bool b=42; //b=1
int i=b; //i=1
i=3.14; //i=3
double pi=i; //pi=3.0
unsigned char c=-1; //c=255
signed char c2=256; //假设char占8bit,c2的值是未定义的
if(i) //在需要bool类型时,编译器依然会执行自动转换,将int型转成true
{i=0;}
类型所能表示的值的范围决定了转换过程。
注:
1.将算术值赋给bool类型时,0–>false,其他非0都为true;反过来同样可以将bool类型赋值给算术类型。
2.浮点数赋给整数时,进行了近似处理,结果值仅保留浮点数中小数点之前的部分。
3.整数赋给浮点型时,小数部分记为0,如果该整数所占空间超过了浮点类型的容量,精度可能有损失。
4.当赋给无符号类型一个超出它的表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的于数。例如,8比特的unsigned char 可以表示0~255,当赋给-1时,实际为-1对256驱魔后的余数:255。
5.当赋给带符号类型一个超出它表示范围的值时,结果是未定义的。此时程序可能继续工作,也可能崩溃。
6.避免依赖于环境的行为,如把int的尺寸看成是一个确定不变的值,但在不同环境中是不同的,所以代码不可移植,最好使用sizeof(int)确定。
含有无符号类型的表达式
unsigned u=10;
int i=-42;
cout<<i+i<<endl;//-84
cout<<u+i<<endl;//4294967264
//通过理论和测试,知道了unsigned表示0~4294967295之间的数(闭区间)
第二个表达式中,相加前先把整数-42转换成无符号数。把负数转换成无符号数类似于直接给无符号数赋一个负值,结果等于这个负数加上无符号数的模。
Note:有符号数和无符号数运算的结果会自动划转为无符号数!特别注意循环判断语句中,当有无符号数时,无符号数不会小于0和自动转换这一事实,可能会造成死循环。
for(unsigned u=10;u>=0;--u)
//死循环,当u=0时执行循环,但--u后又为4294967295
{}
tip:切勿混用带符号类型和无符号类型
2.1.3字面值常量
形如42的值被称作字面值常量(literal)。
整形字面值的三种形式:十进制,以0开头八进制,以0x开头十六进制。例如以下三种表示数值20的方法
20 024 0x14
默认十进制字面值是带符号数。
浮点型字面值:小数或以科学计数法表示的指数
3.14 3.14e0 0. 0e0 .001
字符和字符初字面值
'a'//字符字面值
"a"//字符串字面值
区别:字符串字面值“a”后,编译器自动添加空字符’\0’表示字符串的结束,而字符‘a’就是单独的字符a
之前不知道的一个知识点:字符字面值的分行书写
cout<<"sdfdsff"
"dfsdfs"<<endl;//注:分行之间不加任何符号
转义序列
文中说?是需要转义序列\?输出的,但?转义字符可以在visual studio编译器中直接输出,不报警,无错误。
??? ??? ??? ???
指针字面值
nullptr是C++11中新定义的指针字面值,后面会在介绍。