一、C++的数据类型
C++可以使用的数据类型如下:
说明:
(1)C++中没有规定每一种数据所占的字节数,只规定int型数据所占的字节数不大于long型,不小于short型。
(2)在整型符号int和字符型符号char前,可以加修饰符signed(表示“有符号”)或unsigned(表示“无符号”)。如果指定为signed,则数值以补码形式存放,存储单元中的最高位(bit)用来表示数值的符号。如果指定为unsigned,则数值没有符号, 全部的二进制位都用来表示数值本身。
有符号时,能存储的最大值为2的十五次方-1,即32767,最小值为-32768;
无符号时,能存储的最大值为2的十六次方-1,即65535,最小值为0.
有些数值是没有负值的(如学号、货号、身份证号等),可使用unsigned,它存储正数的范围比用signed时扩大一倍。
二、常量
(一)什么是常量
常量包括 数值型常量和字符型常量
(二)数值常量
1、整型常量的类型
(1)一个整数(其值在-32768~+32767),可以赋值给short int型、int型和long int型变量
(2)一个整数(其值在-2147483648~+2147483647范围内),则认为它是long int型,它可以将它赋值给一个int或long int型变量。
(3)如果某一计算机系统的C++版本确定Int与long int型数据在内存中占据的长度相同,则它们能够表示的数值范围相同。因此,一个int型的常量同时也是一个long int型常量,可以赋值给int型或long int 型变量。
(4)常量无unsigned型。但一个非负数的整数可以赋值给unsigned型变量,只要它的范围不超过变量的取值范围即可。例如可以将50000赋给一个unsigned short int型变量是可以的,而将70000赋给它是不行的(将会溢出)。
一个整型常量可以用3种不同的方式表示:
(1)十进制整数。
- 带或者不带正负号;
- 没有小数点
- 由数字0~9组成的符号串
- 不能以0开始
如1357,-432,0等。在一个整常量后面加一个字母I或L,则认为是long int型常量。例如123L,421L,0L等,这往往用于函数调用中。如果函数的形参为long int,则要求实参也为long int型,此时用123作实参不行,而要用123L作实参。
(2)八进制整数。
- 以0为前缀;
- 没有小数点;
- 由数字0~7组成的字符串;
- 只能表示正整数;
(3)十六进制整数。
以0x(或0X)为前缀;
- 没有小数点;
- 由0~9及a~f(或A~F)组成的符号串;
- 只能表示正整数;
2、浮点数的表示方法
(1)十进制小数形式。
它由整数部分和小数部分组成,可以省略其中之一(如78.0或.06,.0),但不能二者皆省略。
C++编译系统把用这种形式表示的浮点数一律按双精度常量处理,在内存中占8个字节。
如果实数的数字后面加字母F或f,表示此数为单精度浮点数,如1234F,-43f,占4个字节。
如果加字母L或l,表示此数为长双精度数,在Visual C++中占8个字节。
(2)指数形式(即浮点形式)。
其一般形式为:数符 数字部分 指数部分
例如:
a=0.314159e1;
a=3.14159e0;
a=31.4159e-1;
a=314.159e-2;
以上4个赋值语句用了不同形式的浮点数,但其作用是相同的。
(三)字符常量
1、普通的字符常量
定义:用单撇号括起来的一个字符就是字符常量。如‘a','%','#'都是合法的字符常量。
- 在内存中占一个字节;
- 字符常量只包括一个字符,如'AB'是不合法的;
- 撇号(’)是定界符,而不属于字符常量的一部分。如:cout<<'a',输出的是一个字母‘a',而不是3个字符"'a'".
2、转义字符常量
转义字符虽然包含两个或多个字符,但它只代表一个字符,在内存中只占一个字节。
3、字符数据在内存中的存储形式及其使用方法
- 将一个字符常量存放到内存单元是指 将该字符相应的ASCII代码放到存储单元中;
- 在C++中字符型数据和整型数据之间可以通用,一个字符数据可以赋给一个整型数据,反之亦然;
- 也可以对字符数据进行算术运算,此时相当于对它们的ASCII码进行算术运算;
4、字符串常量
定义:用双撇号括起来的字符就是字符串常量,如“abc","hello!","a+b","li-ping"都是字符串常量。字符串常量”abc"在内存中占4个字节(而不是3个)是因为,编译系统会在字符串最后自动加一个'\n'作为字符串结束标志。但’\n'并不是字符串的一部分,它只作为字符串的结束标志。
a | b | c | \n |
注意:
‘a'和"a"代表不同的含义,“a"是字符串常量,’a'是字符常量。前者占两个字节,后者占一个字节。
分析下面程序片段:
char c;//定义一个字符变量
c='a';//正确
c="a";//错误,c只能容纳一个字符
(四)符号常量
用一个符号代表一个常量,称为符号常量,即以标识符形式出现的常量。
#include "pch.h"
#include <iostream>
using namespace std;
#define PRICE 30;
int main()
{
int num, total;
num = 10;
total = num * PRICE;
cout << "total=" << total << endl;
return 0;
}
运行结果:total=300
程序分析:程序中用预处理指令#define指定PRICE在本程序单位中代表常量30。注意符号常量虽然有名字,但它不是变量。在进行编译预处理时,所有的PRICE都被置换为字符30,在正式进行编译时已经没有PRICE这个表示符了。显然符号常量不能被赋值,如用赋值语句"PRICE=40;"给PRICE赋值是错误的
三、变量
(一)什么是变量
定义:在程序运行期间其值可以改变的量称为变量。一个变量应该有一个名字,并在内存中占据一定的存储单元。
(二)变量名规则
1、标识符定义:用来标识变量、符号常量、函数、数组、类型等实体名字的有效字符序列称为标识符。
变量名是标识符的一种。
2、命名规则:C++规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。
3、下面是不合法的标识符和变量名:M.D.John,$123,#33,3G64,Ling li,C++,Zhang-ling,U.S.A
一般变量名用小写字母表示
(三)定义变量
定义变量的一般形式: 数据类型 变量名表列;
C++要求在第一次使用变量之前进行定义即可,也就是说它可以出现在语句的中间。
int a;
a=3;
float b;
b=4.67;
char c;
c='A';
(四)对变量赋初值
1、初值可以是常量,也可以是一个有确定值的表达式。如float a,b=5.78*3.5,c=2*sin(2.0);
2、初始化不是在编译阶段完成的,而是在程序运行时执行本函数时赋予初值的,相当于执行一个赋值语句。
例如:int a=3;
相当于以下两个语句: int a; a=3;
(五)常变量
定义:在定义变量时,如果加上关键字const,则变量的值在程序运行期间不能改变,这种变量称为常变量。
例如:const int a=3;//用const来声明这种变量的值不能改变,指定其值始终为3;
常变量不能出现在赋值号的左边,上面一行不能写成
const int a;
a=3;//常变量不能被赋值
可以用表达式对常变量进行初始化,如const int b=3+6;
四、算术运算符与算术表达式
(一)基本的算术运算符(+ - * / %)
两个数相除的结果为整数。多数编译系统(包括VisualC++)采取“向零取整”的方法,即5/3的值为1,-5/3的值为-1,取整后向零靠拢。
(二)表达式中各类数值型数据间的混合运算
在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。转换的规则如图:
图中横向向左的箭头表示必定的转换,如char和short型数据必先转换为int型,float型数据在运算时一律先转换成double型(即时是两个float型数据相加,也都先转换成double型,然后再相加)
(三)自增(++)和自减(--)运算符
++i 先执行i=i+1,再使用i的值;i++ 先使用i的值后,再执行i=i+1;(减法同理)
如:i=3;cout<<++i;
输出4;
如果改为cout<<i++;
则输出3。
(四)强制类型转换运算符
两种形式:
1、(类型名)(表达式)
例如:(double)a (将a转换成double类型)
(int)(x+y) (将x+y的值转换成整型)
2、类型名(表达式)
如:int(x)或int(x+y)
如果x原指定为float型,值为3.6,进行强制类型运算后得到一个int型的中间数据,它的值等于3,而x原来的类型和值都不变。
3、由以上可知系统类型转换分为 隐式类型转换(系统自动进行转换)和强制类型转换。
当自动类型转换不能实现目的时,可以用强制类型转换。如“%”运算符要求其两侧均为整型量,若x为float型,则"x%3"不合法,必须用“(int)x%3".由附录B可以查到,强制类型转换运算优先于%运算,因此先进性(int)x的运算。
(五)赋值运算符和赋值表达式
1、赋值过程中的类型转换
(1)将浮点型(包括单、双精度)数据赋值给整型变量时,舍弃其小数部分,以整数形式存储。
(2)将整型数据赋给浮点型变量时,数值不变,但以指数形式存储到变量中。
(3)将一个double型数据赋给float变量时,要注意数值范围不能溢出。
(4)字符型数据赋给整型变量,将字符ASCII码赋给整型变量。
(5)将一个int,short或long型数据赋给一个char型变量,只将其低8位原封不动地送到char型变量。
(6)将signed型数据赋给长度相同的unsigned型变量,将存储单元内容原样照搬(连原有的符号位也作为数值一起传送)。
2、复合赋值运算符
a+=3 等价于 a=a+3
x*=y+8 等价于x=x*(y+8)
x%=3 等价于x=x%3
3、赋值表达式
“赋值表达式”一般形式为:变量=表达式
左值
赋值运算符左侧的标识符称为”左值“,变量可以作为左值。
不能作为左值:表达式a+b,常变量
右值
左值都可以作为右值
(六)逗号运算符和逗号表达式
逗号表达式的一般形式:
表达式1,表达式2
逗号表达式的求解过程是:先求解表达式1,再求解表达式2.整个逗号表达式的值是表达式2的值。