C++基础——数据处理
文章目录
简单变量
cout特性
当需要切换输出八进制、十进制和十六进制整数时,可以通过控制符oct
、dec
、hex
来进行控制:
cout << hex;
cout << 0x42;
cout << oct;
cout << 042;
cout << dec;
cout << 42;
这三个控制符只是修改了整数显示方式,并不会显示在打印界面中。
如果使用using name space std;
声明命名空间,则不能再将上面三个控制符作为变量名,但是如果省略,而是用std::hex
这种方式来修改输出方式,则可以用作变量名。
常量类型
类型
没有后缀时,采用能够存储此整型常量的最小类型。
也可以通过后缀控制存储方式:
后缀 | 类型 |
---|---|
u | unsigned int |
l | long |
ul | unsigned long |
ull | unsigned long long |
后缀可以采用任何一种顺序,大写小写均可。
长度
十六进制有些特殊,通常十六进制采用无符号类型,因为十六进制通常用来表示内存地址,内存地址是没有符号的。
char类型
char
类型本身很简单,区分为常规字符和转义字符,在C语言和C++早期版本中,字符常量被视作int
类型,存放在16位或32位单元中,当进行char ch = 'M'
操作时,将整型常量M
中的低8位存放到ch
中。
因此cout
保留了成员函数put
,可以通过cout.put('$')
来输出一个整型常量为字符。
但是后来C++将字符常量存储为char
,put
方法也不是必要的了。
可以基于字符的八进制和十六进制编码来使用转义字符。
比如Ctr+Z
的ASCII码为26,对应八进制编码为032,对应十六进制编码为x1a,则可以用\032
和\xla
来表示。
signed char和unsigned char
默认情况下char
可能没有符号,也可能有符号,由C++实现决定。
可以通过signed char
和unsigned char
显式声明。
wchar_t
当处理的字符集无法用8位字节表示时,可以使用wchar_t
扩展字符集来表示。
wchar_t
类型是一种整数类型,由于cin
和cout
使用的是char
流,想要处理wchar_t
类型可以使用wcin
和wcout
来完成。
wchar_t
有一个底层类型,底层类型即基于某个基本类型,它的长度取决于实现。
char16_t和char32_t
wchar_t
随实现的不同长度不同,为了解决这个问题,引入了新的类型char16_t
和char32_t
。
前者字符常量或字符串常量使用u
前缀标识:u'C'
。
后者字符常量或字符串常量使用U
前缀标识:U'C'
。
const限定符
const
限定符用于处理常量,以const
限定的变量仅唯一表示初始化时的值,此后不能对其进行修改。
const
相比于#define
,const
有很多好处:
- 能够明确指定类型
- 可以使用作用域规则将定义限制在某个特定作用域
- 可以用于复杂类型
浮点数
浮点数表示的范围要比整型大得多,但是运算速度和精度都会相应降低。
浮点数常量默认情况下存储为double
类型,若添加后缀f
则可存储为float
类型,若添加后缀L
可存储为long double
类型。
C++算术运算符
类型转换
类型转换是C++中很重要的概念。当赋值时类型不同,或不同类型数据运算时,都涉及到类型转换。一般的类型转换将取值范围小的类型转换为取值范围大的类型,若整型和浮点型同时存在则将整型转换为浮点型。
初始化和赋值中的转换
当我们将取值范围小的类型赋值给取值范围大的类型通常没问题,但是反之可能出现问题。
当大范围转换为小范围时对大范围的数值进行截断,即只取小范围数据的那部分。
若将浮点数转换为整型可能出现浮点数超出整型可表示范围,此时的结果是不确定的,基于不同的实现而不同。
表达式中的转换
在计算表达式时,通常将比int
类型小的类型转换为int
类型然后进行计算,这种转换成为整型提升。
当不同类型之间进行转换时通常将小类型转换为大类型。
- 如果有一个操作数的类型是
long double
,则将另一个操作数转换为long double
- 否则,如果有一个操作数类型为
double
,则将另一个操作数转换为double
- 否则,如果有一个操作数为
float
,则将另一个操作数转换为float
- 否则,说明操作数都是整型,执行整型提升
- 在这种情况下,如果两个操作数都是有符号或者无符号的,且其中一个操作数的级别比另一个低,则转换为级别高的类型(通常指大小)
- 如果一个操作数为有符号的,另一个为无符号的,且无符号的操作数的级别比有符号操作数高,则将有符号操作数转换为无符号操作数所属的类型
- 否则,如果有符号类型可表示无符号类型的所有可能取值,则将无符号操作数转换为有符号操作数所属的类型
- 否则,将两个操作数都转换为有符号类型的无符号版本
强制类型转换
强制类型转换不会修改变量本身,而是创建一个新的、指定类型的值,可以在表达式中使用这个值。
有两种格式:
(typeName) value;
typeName (value);
在C++中通常使用第二种格式,为的是让强制类型转换看起来更像是一个函数调用。
auto声明
auto
时C++11中新增的工具,但是很少使用。
它的作用是让编译器自动识别变量类型,用作基本类型时会比较鸡肋,但是在使用STL
时使用auto
会非常好用。
这部分会在STL
部分详细解释。