C++数据类型及处理
变量声明定义格式: type variablename
比如:int a;//定义一个整型变量a
建议:定义变量名字最好和其代表的实际意义相符,如成绩-----score
基本数据类型
一些基本类型可以使用一个或多个类型修饰符进行修饰:
- signed-----------带符号,包括正数部分和负数部分
- unsigned-------不带符号,也就是只包含正数那部分
- short--------------短型,short int 为2字节,int为4字节,long int为4字节,long long int 为8字节
- long
注1:不同系统有所差异,这里以32位cpu为准
注2:有个比较有用的头文件climits,旧式文件为limits.h,该头文件包含了各个数据类型的最大值和最小值,如INT_MAX,INT_MIN,LONG_MAX,LLONG_MAX等等,具体有兴趣可以自行百度
注3:可以用sizeof运算符获取数据类型所占字节数,如sizeof(int),sizeof(char)
宏定义
之前提到了climits头文件,里面包含了各个数据类型的最大值以及最小值,其实就是在头文件定义了相关宏。例如:#define INT_MAX 2147483647
这句语句的意思就是定义一个宏INT_MAX,它表示2147483647这个值,在代码中任何出现INT_MAX的地方全部用2147483647替代。
初始化
定义一个变量后就要初始化,否则系统会给它分配一个随机值,不过有三种情况除外,分别是全局变量,静态变量和动态申请。(这些后面再说)
int a=45;//定义一个变量a,初始化为45,这个过程包括了定义变量以及赋值两个操作
八进制,十六进制数
0xddd---------十六进制,如0x100=256
0ddd-----------八进制,如0100=64;
const限定符
现在来介绍一下学习中以及面试中比较重要的限定符之一const。用const修饰一个变量表示该变量是一个不可修改的常量,并且在定义同时必须初始化。如const int a=14;并且之后不能对a的值进行修改。如果有印象的话,之前提到过宏定义也可以表示一个常量,那么他们区别是什么呢?
1.宏定义只是一种预处理,它只是单纯的替换而已,没有类型检查,而且不会被分配内存,const 修饰的变量在编译阶段会被检查类型,而且变量会被分配内存
2. #define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 …
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝(因为是全局的只读变量,存在静态区),而 #define定义的常量在内存中有若干个拷贝。
算数运算符
常见的加减乘除,这就不啰嗦了,对于优先级的话,强烈建议前期用括号,在实践中再慢慢记忆一些常见用法。这样也是让代码具有更好的可读性。
类型转换
一般分为隐式转换和显示转换,一个整数与一个浮点数进行算数运算,结果是浮点型。
#include<iostream>
#include<typeinfo>
using std::cin;
using std::cout;
using std::endl;
using namespace std;
int main()
{
int x = 3;
float y = 7;
cout<<typeid(x+y).name() << endl;
return 0;
}
输出结果:
float
上图是隐式转换的优先顺序。
接下来讲显式转换,常见的如 type(variable)---------->int(a);//将变量a强制转换为整型。或者(int)a;也行,其他类型类同。后续还会介绍四种强制类型转换。
auto和decltype
可以说这两个是非常强大的工具,比如auto a=4.5;//a自动会被编译器当成整型,根据你给的值倒推数据类型,或者decltype(4) a=6;//decltype(4)自动推导4的类型为整型int,然后将a定义为整型。
#include<iostream>
#include<typeinfo>
using std::cin;
using std::cout;
using std::endl;
using namespace std;
int main()
{
auto x1 = 4;
auto x2 = 7.9;
decltype(4) y1 ;
decltype(9.8)y2;
cout << typeid(x1).name() << endl;
cout << typeid(x2).name() << endl;
cout << typeid(y1).name() << endl;
cout << typeid(y2).name() << endl;
return 0;
}
输出结果:
int
double
int
double
有的时候我们在写代码的时候会碰到那种很复杂的类型,这时候不妨用auto可以非常方便(尤其是当你接触到stl容器里面的迭代器类型的时候,真的不要太爽),那如果不给它初始值会怎么样呢?当然是会报错喽!编译器会告诉你它无法推导。