C++的数据类型
1. 常量
1.1常量的定义及分类
在程序中值无法被改变(或固定不变)的量称为常量,常量分为数值型常量和字符型常量两大类。
1.2数值常量
数值常量就是通常所说的“常量”,这里不在进行赘述,着重讲述一下常量之间的进制种类和之间的转换。
一个整型常量可以用3种不同的方式表示:
(1)十进制整数。如1314,-432,0等。在一个整常量后面加一个字母l或L,则认为是long int型常量。例如123L,421L,OL等,这往往用于函数调用中。如果函数的形参为long int,则要求实参也为long int型,此时用123 作实参不行,而要用123L 作实参。
(2)八进制整数。在常数的开头加一个数字0 就表示这是以八进制数形式表示的常数。如020表示这是八进制数20,它相当于十进制数16。
(3)十六进制整数。在常数的开头加一个数字0和一个英文字母X(或x),就表示这是以十六进制数形式表示的常数。如0X20表示这是十六进制数20,它相当于十进制数32。
由于进制之间的转换所写的篇幅稍微有点长,所以我决定再起一篇博文进行续写,各种进制之间的相互转换以及浮点数的进制和转换都会在另一篇博文中,有兴趣的朋友可以去看一下。
1.3字符常量
用单撇号括起来的一个字符就是字符常量。例如:
'a','#','$','D' //注意字符常量只包括一个字符,如'ab'是不合法的。
1.3.1转义字符常量
转义字符是以“ \ ”开头的字符序列,都具有特殊的作用。
1.3.2字符串常量
字符串,顾名思义,就是多个字符串起来的,所以用双撇号括起来的字符就是字符串常量。字符串都是以’\0’结束的,这也是字符常量和字符串常量的区别所在;
char c; // 定义一个字符变量
c='a'; // 正确
c="a"; // 错误,c只能容纳一个字符,而"a"是一个字符串,占两个字节
2. 变量
2.1什么是变量
在程序运行期间其值可以改变的量称为变量。变量名代表内存中的一个存储单元,在对程序编译连接时由系统给每一个变量分配一个地址。变量值则是在程序中从变量中取值。
int love =21; //这里对整形变量love进行了初始化,love是变量名,21则是变量的初始值
2.2变量定义
变量定义的基本形式是:以类型说明符开头,随后紧跟着由一个或多个变量名组成的列表,其中变量名以逗号分隔,最后以分号结束。
类型说明符也称为标识符,用来标识变量等实体的有效字符序列称为标识符。简单来说标识符就是一个名字,其中变量名也是标识符的一种。
- C++规定标识符只能由字母、数字和下划线开头,且第一个字符必须是字符或者下划线。
- 变量名一般用小写字母,如index,不用Index或者INDEX。(标识符对长度没有限制,但是对大小写字母敏感。)
2.3变量初始化
变量的初始化即在变量创建时赋予一个特定的值。
int a=100,b=101 //对整型变量a和b进行初始化,分别赋予初始值100和101
double price=21.99; //对双精度型变量price进行初始化
double Sale_price=price*0.13; //用已被赋值的price变量对变量Sale_price进行初始化
- 注意:初始化不是赋值。初始化是在创建变量时赋予的一个新值,而赋值是把变量当前的值擦除,找一个新的值来代替。
- 默认初始化:如果定义变量时没有指定初始值,则变量被默认初始化。定义于任何函体之外的变量被初始化为0。但是定义在函数体内部的内置类型变量将不被初始化如果试图以其他形式访问这个变量将引发错误。
2.4变量的声明
变量的声明与定义并没有很大的区别,二者都规定了变量的类型和名字,但绝不能说变量的定义与声明相同。
二者区别:
(1)定义创建了变量,并为其分配内存;声明没有分配内存。
(2)一个变量在一定的区域内只能被定义一次,却可以被多次声明。
3.C++的运算符
3.1算数运算符和算术表达式
3.1.1基本的算数运算符
加法运算符(+)、减法运算符(-)、乘法运算符(*)、除法运算符(/)、取模运算符(%)、自增运算符(++)和自减运算符(- -)。
C++算数运算符的优先级也和数学中一样——“先乘除,后加减”,且当运算符的优先级相同时,结合方向为“自左向右”即先左后右。
d=a+b-c; //由于+与-的优先级相同,所以运算时b先结合左侧的+号,完成a+b后与c相减。
3.1.2自增运算符和自减运算符
"++“即使变量自身的值加1,”–"则是变量自身的值减1。要注意自增和自减运算符前置与后置的意义是不一样的。
运算符在前,则先进行运算,再进行赋值,运算符在后,则先给变量赋值,再进行运算。(我个人是这样理解的:运算符本身就是对变量进行加减的一种运算符,代表运算,所以++在变量前面,就是先进行自增的运算,之后再把运算后的结果赋予变量。)
运算符在前:
int i,j; //定义两个整形变量
i=3;
j=++i; //++运算符在变量i前,先进行自增的运算(先运算),3+1=4,自增的结果为4,然后把4赋给j(后赋值)
//此时,i的值为4,j的值也为4
运算符在后:
int i,j;
i=3;
j=i++; //++运算符在变量i的后面,于是要后运算,先把i的值,即3赋予j,然后进行自增的运算,i+1,此时不在对j进行赋值
//结束后,i的值为4,但是j的值为3
3.2赋值运算符和赋值表达式
3.2.1赋值运算符
赋值符号“ = ”就是赋值运算符,它的作用就是将一个数据赋给一个变量,所以赋值运算符左侧的运算对象必须是一个可修改的值。
int i=0,j=0,p=0;
const int c1=i;
1314=p; //错误:左值为一个数值常量
i+j=k; //错误:算数表达式应为右值
c1=k; //错误:c1是常量,不可被修改
3.2.2复合赋值运算符
在赋值号“ = ”之前加上其他运算符,可以构成复合运算符。常见的有:
+= -= *= /= %= // 算术运算符
<<= >>= &= ^= |= // 位运算符
3.3逗号运算符和逗号表达式
3.3.1逗号表达式(注意优先级(大坑))
逗号表达式的一般形式为:表达式1,表达式2,含有两个运算对象,按照自左向右的顺序依次求值,且表达式最后的结果为表达式2的值,舍弃表达式1的值,如
int a=4,b;
a=3+4,a*8;
b=(5-1,a-30,2*9,3*18,3+3);
按理来说a的值应为4乘8为32,那么恭喜你成功入坑了,要注意考察逗号表达式时一般都会和赋值运算符结合起来考察,这是最大的坑,如果不特别注意的话,是很容易忽略赋值运算符的优先级是高于逗号运算符的(它是优先级最低的),于是应该理解为“ a=3+4 ”是一个赋值表达式,然后“ a*8 ”是另一个表达式,二者用逗号相连,构成一个逗号表达式。所以整个逗号表达式的值为56,但是a的值为7。
这里对第二个表达式求值时用括号把表达式括起来了,所以b的值应为整个逗号表达式的值,无论逗号表达式有多少个运算对象,表达式的结果永远为最后一个运算对象的值,则b的值应为3+3为6。
逗号表达式的要领:
-
逗号表达式的运算过程为:从左往右逐个计算表达式。
-
逗号表达式作为一个整体,它的值为最后一个表达式(也即表达式n)的值。
-
逗号运算符的优先级别在所有运算符中最低。
3.4逻辑和关系运算符
3.4.1逻辑运算符和关系运算符类型
逻辑非( !) 逻辑与( && ) 逻辑或( || )
小于( < )大于( > )大于等于( >= )小于等于( <= )相等( == )不相等( != )
- 逻辑运算符作用于任意能转换成布尔值的类型,二者的返回值都是布尔类型。
- 两类运算符的结果都是右值。
- 对于逻辑与运算符(&&)来说,当且仅当两个运算对象都为真时,结果为真。
- 对于逻辑或运算符( || )来说,只要两个运算对象有一个为真,结果就为真。