文章目录
一、常量与变量
-
变量名、常量名、函数名(你自己取的那种)统称标识名,标识名只能以字母或下划线开头,中间只能用字母数字下划线;不可以是系统保留字如int、return等。
-
变量赋值:
int a = 10; int a (10);
记得要习惯性赋初始值哦。 -
不同的数据类型的存在是为了便于处理数据。
1、整型
整型类型 | 类型名 | 空间 | 范围 |
---|---|---|---|
基本整型 | int | 4byte | -231~231-1 |
无符号基本整型 | unsigned [int] | 4byte | 0~232-1 |
短整型 | short [int] | 2byte | -215~215-1 |
无符号短整型 | unsigned short [int] | 2byte | 0~216-1 |
长整型 | long [int] | 4byte | -231~231-1 |
无符号长整型 | unsigned long [int] | 4byte | 0~232-1 |
方括号内可省略,定义语言如下:
short int shortnum;
short shortnum;
unsigned short count;
进制
0b或者0B开头:2进制
0开头:8进制
0x开头:16进制
10进制不带前缀。
2、实型
实型(浮点型) | 有效数字 | 空间 | 范围 | 精度 |
---|---|---|---|---|
单精度float | 十进制六位有效数字 | 1byte指数,3byte尾数 | 2-128~2128/10-37-1038 | 二进制24位,十进制6-7位 |
双精度double | 十位有效数字 | 3byte指数,5byte尾数 | ||
长双精度long double | 十位有效数字 | 3byte指数,5byte尾数 |
3、字符型char
存一个字母或符号,占一个字节,存内码 (ASCII:用的16进制,表格读取是行+列,eg:a是61=616+1,大写和小写字母连续存储;包含可打印和非打印字符(控制字符))*
非打印字符:控制字符
可打印字符:单引号括起来的数据 eg:‘a’,‘S’,‘2’;而双引号表示字符串。
赋值:
char c1,c2;
c1 = 'a';
c2 = 97;
//c1==c2
- c=1和c=’1‘不一样。c='1’里面存的是1这个字符的内码。
- 另:0-9的字符依次存放,用于高精度的计算。用字符串存……两个数位相加用(c1-‘0’+c2-‘0’+‘0’)
- 输出用"c"和’c’有什么区别?是字符串和字符类型的区别吧
转义字符
非打印字符用转义字符(加\的那种)表示:
换行符 \n
要输出单双引号,在要打印的符号前加" \ ",单个的可以直接搞
cout<<"\"abc\""<<endl;
八进制数转义序列 \a 没懂什么意思
水平制表 (tab?) \t(注意用\t的时候可以自动调整缩进,意思是它是右对齐的,而不是一定有多少空格)
退一格 \b
回车 \r
换页 \f
字符数组
char ch[100005];
char c;
cin>>ch;//意思是读入字符串
//可以用strlen(ch),得到的是字符串长度,实际字符个数;
cin.getchar(c);//可读入空格
cin.getline(ch);//可读入带空格的字符串,默认到回车结束,但是可以
cin.getline(ch,len,'.');//意思是读len个,到'.'结束
注意:字符数组赋值
int main(){
char s[]={'1','2','\0'};//要么s里面加长度,是字符个数+1,要么后面自己加个\0,否则\0会被乱加!!!!然后输出就很混乱!!!!
cout<<s<<endl;
return 0;
}
4、枚举类型
用于有限可数的对象
1、用数字代替
2、define
3、新的数据类型
定义新的数据类型:
enum weekdayT{Sunday,Monday,Tuesday,Wednesday,Thursday};
//定义了数据类型,类型名是weekdayT,里面可以存的东西是这几个玩意
weekdayT weekday;//int weekday;
weekday = Sunday;//赋值
不可以直接输出Sunday等字符,输出的还是数字吧应该,因为内部存储还是数字
typedef int INTEGER;//换语言了不想改习惯可以这样用
5、用类(class)定义数据类型
(第十章)
查内存
sizeof(int);//数据类型占的内存量
sizeof('a'+15);//计算结果所占的内存量
6、符号常量
const int N = 20000;
const double PI = 3.14159;//需要定义类型哦
#define 符号常量 字符串
#define PI 3.14 //当作字符串处理了……就是一个替换的作用
#define A 3+5;
int B;
B = A*2;//B=13
二、算数表达式
1、常识
- 赋值表达式的值等于右边表达式的值, 赋值运算符是右结合的
- 类型自动转换:右边的数塞到左边的类型里面,实型丢小数部分,整型到字符型是取最低八位
- “-”可以为一元运算!!!意思是可以表示取负数吧
- 实型常量为double,如写小数3.5就是double类型
- i++是搞完再++;++i是先++再搞事
- 用+= -=的计算效率更高(?)
int k=2;
k *= 2+1000;
cout<<k<<endl;//是先算完了表达式再去*!!!!
//不会真的有人把k设成1吧
关于STL :
vector 返回的是unsigned
-1变unsigned 不是-1了!!!!
2、不同类型变量做运算
-
占空间向大的靠拢,数值范围向大的靠拢
eg:
整+double=double;
整/整=整;
float+double=double;
bool,short,char 都变成int参与计算;
int +unsigned int = unsigned int; -
字符型 -> 整型变量:将字符型数据放入整型变量的最后一个字节。如果所用系统将字符处理成无符号量,则前面补0。如果所用系统将字符处理成有符号量,则扩展符号。
-
当用到多重赋值时,要保证所有的变量都是同类型的,以避免在自动类型转换时出现与预期不相符的结果的可能性。如变量d定义为double,变量i定义为int,语句
d = i = 1.5;
的结果是:i等于1,d等于1.0 。
强制转换:
//不要写
a = (double)(x/y);//没有意义
3、优先级
互联网,你伤我好深
!运算
算术运算(±*/)
关系运算(> < >= <=)
关系运算2(== !=)
赋值运算(=)
&& 运算
| | 运算
位运算不知道放哪
三、位运算
不管原来的数是正还是负,取反得到的结果总是原数相反数-1。(取反的时候符号位也取反了)
注意这里,左移右移只是一个运算表达式,并没有改变A的实际值,所以不用担心对A造成影响。
对于负数,补符号位:如果A=-60,现在A的原码1 011 1100,二进制补码1 100 0100(符号位不变!)。右移两位,是1 111 0001,写成原码是1 000 1111,写成十进制是-(1+2+4+8)=-15.
现在问题是,为什么可以出240……在检测“二进制位包含符号位否”的试验中遇到的问题
四、存储类型:
自动变量:auto
寄存器变量:register
外部变量:extern
静态变量:static
1、auto
- 在函数内或块内定义的变量缺省时是auto。如
auto int i;
当进入块时,系统为自动变量分配空间。当退出块时,系统释放分配给自动变量的值。因此自动变量的值就消失了。当再次进入该块时,系统重新分配空间。 - 注意:C++98中的auto多余且极少使用,C++11中auto被用于自动推断被定义变量类型,自动变量无需再用auto说明。
2、register
- 存储在寄存器中,代替自动变量或形参,可以提高变量的访问速度。如无合适的寄存器可用,则编译器把它设为自动变量。
- 现在的编译器具有一定的智能,能够识别频繁使用的变量并进行优化。
- 注意:只有局部自动变量才能定义为寄存器变量,全局变量和静态局部变量不能定义。
3、extern
- 声明一个不在作用范围内的全局变量。如:
extern int num;
num为某一个全局变量。 - 用途:
1.在某函数中引用了一个声明在本函数后的全局变量时,需要在函数内用extern声明此全局变量。(函数内用函数外的变量)(main里面的也是局部不是全局)
2.当一个程序有多个源文件组成时,用extern可引用另一文件中的全局变量。(文件内用文件外的变量) - 教材118页说“类型名可省略”现在不可以
4、static
- 为在整个程序的运行期间都存在的变量限定访问范围。
- 两类静态变量:
1、静态的局部变量,函数里的局部变量在函数用完以后是不释放的(局部静态变量的初值是编译时赋的。当运行时重复调用此函数时,不重复赋初值。虽然局部静态变量在函数调用结束后仍然存在,但其它函数不能引用它。)
2、静态的外部变量static int x;
//全局(外部)static,作用是不让别的程序extern引用它。 - 生存期相同,作用域不同(语句块内,文件内)