关于数据类型和运算符这块在很多语言中都大同小异,但有不少细节和注意点,乱用数据类型对程序也是一种负担,同时也不会得到预期的结果。
一、基本数据类型
1、整型
#include<iostream>
using namespace std;
void main()
{ //该类型所占用的内存大小
signed char value1; //1个字节 一种以字符型表示整型的方式,后面说明
short value2; //4个字节
int value3; //4个字节
long value4; //4个字节
long long value5; //8个字节
cout << INT_MIN << endl; //可输出int类型的最小值
cout << INT_MAX << endl; //可输出int类型的最大值
}
除了signed char 一般占用1个字节,其他类型占用的字节数取决于编译器,但一般都是这么多内存。
大家可以用我后面的两句输出方式去测试下其他类型的值域,当然也有其他一些方法。
2、浮点型
float value1; //单精度浮点数
double value2; //双精度浮点数
long double value3; //扩展的双精度浮点数
cout << FLT_MIN << endl; //输出float类型的最小值
cout << FLT_MAX << endl; //输出float类型的最大值
浮点数的数据类型只有3种,但他们的范围确实有点恐怖,一般我们平时用float就足够了,精度越高的浮点类型所占的内存空间越大,我们在定义变量时选择合适的数据类型也很重要。
3、布尔类型
bool value1 = true; //真、非零、1、存在
bool value2 = false; //假、0、不存在
cout << value1 << endl; //输出为1
cout << value2 << endl; //输出为0
value1 = 100;
cout << value1 << endl; //输出还是为1
这种类型在判断语句中最常用,true和false代表的意义视具体情况而定。
4、不同进制数的表达
这就需要一些进制转换的知识了,但这也是必需的,C++中很多时候会操作不同的进制数,常见的有二进制、十六进制还有我们最常用的十进制。
int value1 = 0x1AF; //十六进制表示,加前缀0x或0X,对应的十进制为431
int value2 = 0377; //八进制表示,加前缀0,对应的十进制为255
cout << value1 << endl; //最终输出的是十进制表达
cout << value2 << endl;
C+中不支持二进制数变量的定义,不过它内部操作的都是二进制数,以后我们可以使用位运算符操作二进制数。
注:0377与377在C++中的表示是不同的,这两者完全不同,前者为八进制表示,后者时十进制。
5、字符型
char a = 'a';
int map = a;
char b = 'b';
char sb{ ++a };
cout << a << endl;
cout << map << endl; //输出97,时a字符在ASCII中的位置
cout << b << endl;
cout << sb << endl; //输出b
char类型所定义的字符都在ASCII编码表中,有256个字符编码,所以可以实现字符与整数之间的转换,不过这个整数代表的是该字符在编码表中的序列。
ASCII中的256个字符编码在很多时候是不够用的,所有现在又有了Unicode字符集,于是C++中也有了对应的字符基本类型:wchar_t、char16_t、char16_t 这些类型与char大同小异,大家可以自己去测试下。
6、定义固定值的变量
int value1 = 100; //普通变量
const float PI = 3.1415; //用const定义的变量,不可更改
cin >> value1;
cout << "value1:" << value1;
PI = 100; //无法改变PI的值,C++会报错
const关键字让变量的值不可更改,一般会定义固定不变的值,如汇率、换算比率、固定名称等。
二、运算符
关于运算符还是看书吧,这内容有点多,取模运算说下:
int a = 16;
int b = 5;
int result = a%b; //result = 16-3*5,即16/5的余数,为1
cout << result;
注:C++中的取模运算不能用于浮点操作数
这种运算方式会在以后带来很多神奇的操作。
还有一个sizeof()
int b = 21;
int space = sizeof(b); //计算出该变量所需要的内存空间为多少字节
cout << space; //输出为4,即为4个字节,也是int类型所需的内存
这也是种运算符,用途很广,也很方便实用,大家可以用它去看看各种类型所需的内存大小。
三、类型转换
在二元运算符进行运算时,要求两个操作数的类型相同,如果他们类型不同,那么我们的编译器会把其中一个操作数转换为另个操作数的类型,这也被成为隐式转换,你是看不出来的。这里转换的是值域较小的操作数,显而易见,如果将值域大的数向小的方面的转换,可能会丢失数据,造成计算出错。
#include <iostream>
using namespace std;
int main()
{
int a = 16;
float b = 24.3456;
int result1 = a + b; //这里想计算出了float类型的结果,在转换为我们定义的类型int,舍去了小数
float result2 = a + b;
cout << result1 << endl; //输出40
cout << result2; //输出40.3456
return 0;
}
但更多地时候需要我们自己去转换类型即 显式转换
int a = 16;
float b = 24.3456;
float result1 = a + (int)b; //老式转换,C语言中的方式
float result2 = a + int(b); //新的转换方式,C++自己的
cout << result1 << endl; //输出40
cout << result2 << endl; //输出40
一般我们用C++自己定义的转换方式,当然还有其他方式,不过这种也一般也够用了,类型转换十分重要,在后面C++类的转换就会明白,这也是C++实现多态的关键之一。
auto关键字
auto a = 21; //a为int类型
auto b = 23.2342; //b为float类型
auto c = 'm'; //c为char类型
auto会推断你赋值的类型,然后告诉编译器。这种做法虽然感觉很方便,但也很愚蠢,当很多数据都使用auto定义时,你根本分不清这些数据的类型了,在C++有不少看上去很方便但实际开发中不会用到的关键字或函数。
结语:这篇的内容只是整理了部分数据类型和运算符还有关于类型转换方面的知识点,这些内容只要肯去敲代码测试,都可以总结出来,不过可能比较零碎,结合C++基础书籍还是很有用处的。