基本数据类型处理
简单变量
变量名
变量是c++中对于一个物体,东西概念的名称,代表着某些东西之后,就可以给它赋值
c++声明变量的规则:
①、变量名只能由字符字符、数字和下划线组成,例如:_liming123
②、变量名第一个字符不可以是数字
③、大写字符和小写字符是在c++中是区分的
④、不能将关键字设为变量 例如:cout,cin,main,int
⑤、两个下划线 或者 下划线和大写字符 打头的名称被保留实现使用。以一个下划线开头的名称被保留给实现,用作全局标识符。
⑥、长度无限制,平台可能有限制
数据类型
一、整型
无小数部分的数,也就是常规的整数。
基本整型关键字有:short,int,long,long long
常规情况下,short 16位,int 32位,long64位,long long64位,以上数值不确定,跟操作系统的版本有关。存储单元一般是以8位为一字节,上面的字节数,是位数除以8就可以得到了。
16位是什么概念 二进制的范围可以从下面看出来
0000000000000000-01111111111111111
1000000000000000-11111111111111111
也就是(-2^15 ~ 2^15-1)
相应的类型,有相应的范围,一旦超过这个范围,则程序会报错。
使用例子:
int a=10; //valid
int b=65536; //invalid (-65536~65535)
short c=100;
long d=1000;
二、字符型
char类型为字符型,一般可以认为是ascii码中有的,都可以设置为它,
贴张网图:
例子:
//字符使用单引号,字符串使用双引号
char a='%';
char b='a'; //1
char c=97; //b与c一样,字符‘a’前面十进制数字,可以直接给char变量
三、浮点数
浮点数类型有:float ,double ,long double
float32位;double64位,最少48位,且大于float;long double可为80,128等,至少要大于double;
float a=123.456f; //可以在数字后面加上类型首字母,表示是这个类型的变量
double b=123.456f;
long double c=123.456l;
long int d=123l;
数值后面加符号,是为了让程序员看数值就看出来这个变量是什么类型的变量。大规模的编程中,声明一个变量,在很远的地方会对其赋值或修改,如果能通过不远处别人对其进行的赋值能看出他的类型,那是相当好的。
四、布尔类型
布尔类型就是bool关键词声明的变量,声明bool类型,则其只有两个选项可以给该变量赋值,一个是true,一个是false。或者是1与0;一般用于判断
常量
常量一般指一个不可更改,始终如一的量,在程序运行过程中,常量是不可更改的。
c语言一般使用预处理方法**#define**,也叫宏定义,预处理方法又叫预编译,在编译前操作就已经完成。而设置的量,也是常量,如下所示,宏定义方法:
#define Max 100 //中间空格,没有分好
c++提供更好的处理方法:限定符const,使用方法如下:
//const type name=value;
const int Max=100;
复杂变量
数组
声明方式:type name[length];
例子
int a[10];
char b[20];
double b[]; //也可不填
数组当然也是存储数据的方式,那怎么存呢?
for(int i=0;i<10;i++){
a[i]=i; //a数组从0-9,填的也是0-9
}
int b[5]={
1,2,3,4,5};
char c[5]={
'a','b','c','d','f'};
字符串
1、字符与字符串的区别就是字符后面有’\0’,例如:
char a[5]={
'a','b','c','d','f'}; //普通字符数组,不是字符串
char b[5]={
'a','b','c','d','f','\0'}; //字符串
//字符串常规形式
char c[5]="abcdf";
2、string类
使用前声明头文件#include< string>,声明的时候可以直接使用string声明变量
#include<iostream>
#include<string>
using namespace std;
int main(){
string name="zhangsan"; //声明方式
}
3、其余字符串类
wchar ,char16_t (16位),char32_t(32位),Raw(原始字符串)
结构体
结构体声明关键字位:struct,接下来使用例子
struct student{
char name[20];
int age;
char sex;
}stud{
"黎明",
43,
'm'
}; //不太使用这种初始化变量,分开比较清晰
struct Teacher{
char name[20];
struct student stu[50];
double wages;
char course[10];
};
int main(){
student s;
Teacher teacher;
teacher.stud[0]=stud;
teacher.stud[1]=s;
teacher.wages=10;
teacher.course="数学";
teacher.name="李四";
}
共用体
共用体(union)是另一种特殊数据结构,主要功能就是节省内存,如何节省内存?,使用方法代码如下:
union ab{
int age;
char *name;
double length;
};
union ab exam;
int main(){
//调用方式与结构体相同
cout<<exam.age<<exam.name<<exam.length<<endl;
}
用法与结构体基本相同。
共用体中设置的变量,无论多少个变量,都是在一个存储空间内的,所以只有一个变量可以有值,其他的由于没有存储空间,存储的值将会丢失。
来一个例子:
int main(){
union ab exam;
exam.age=10;
exam.length=20;
exam.name="张三";
cout<<exam.age<<" "<<exam.name<<" "<<exam.length<<endl;
}
结果如下:
前面赋的值,后面全都覆盖了,所以全都丢失了。
一般嵌入式方向,内存不大,但是程序却要正常运行,则需要不断地精简内存的使用,union共用体就能够派上用场了。
指针
1、前面讲的数组就可以当做指针,指针设置方式:
type *name=value;
int *p;
int a=10;
p=&a; //*p是一个值,p是一个地址,&a是一个地址
while(p++); //地址向后推
2、指针的危险
由于指针需要一个位置存储,数据需要一个位置存储,声明后的指针变量仅仅有了自己存的地方,但是变量的值存在哪里呢?若不初始化指针指向的地址,则会出现非常隐匿的BUG,如下
int *p;
*p=1001; //1001存到了何处?谁也不晓得
解决办法有两种,一种每次使用前都将变量的地址初始化好,像1一样赋值。
另一种使用new创建内存,代码如下:
int *a=new int; //创建了一个内存地址,使得指针a指向该内存区域
*a=100; //100存到了创建的内存空间里
上面的代码就要考虑到释放内存,这样指针第二个危险之处就出现了。c++释放使用的delete,但是释放了内存空间之后,指针还是存在的( 攀岩爱好者将铁钩勾上上面的岩石向上攀爬,但是delete之后,岩石没有了,铁钩和人怎么办? ),一旦再次使用这个指针就会出现问题。
在释放前需要将其指向NULL,c++中delete对空指针使用安全。( 在岩石消失前,必须让铁钩勾上其他岩石之后,钩子上的岩石才能消失 )
代码如下:
*a=NULL:
delete a;
循环与关系表达式
循环
1、for循环
使用形式: for(初始化;测试;更新操作){主体}
//形式:
int i;
for(i=0;i<10;i++){
cout<<"第"<<i+1<<"次"<<endl;}
//形式二
int j=0;
for(;j<10;j++){
cout<<"第"<<j+1<<"次"<<endl;}
//形式三
for(int i=10;i;i--){
cout<<"第"<<i+1<<"次"<<endl;}
2、while循环与do…while循环
while循环使用形式:while(condition){body;} 条件为1,则循环执行,直到条件为0,停止循环
do…while循环使用形式:do{body;}while(condition); 先执行循环体,执行完成后,若condition仍然是1,则继续循环,若为0,停止循环。
3、break与continue
break:停止该层循环体 continue:停止本次循环
代码解释:
//break 演示
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(j==2)break;
cout<<j<<" ";
}
} //j循环一旦j==2时,就会打断该循环
//所以结果应该是:0 1 0 1 0 1 0 1 0 1
//continue 演示
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(j==2)continue;
cout<<j<<" ";
}
} //一旦j=2,则j==2的循环就结束了,不会再执行cout<<j<<" "
//结果应该:0 1 3 4 0 1 3 4 0 1 3 4 0 1 3 4 0 1 3 4
表达式
优先级 | 运算符 | 含义 | 用法 |
---|---|---|---|
1 | () | 圆括号 | |
1 | [ ] | 下标运算符 | |
1 | -> . | 结构体成员运算符 | a->age;a.age |
2 | ! | 逻辑非 | a=0;if(!a) |
2 | ~ | 按位取反 | ~100 |
2 | ++ | 自加 | i++先用后加,++i先加后用 |
2 | - - | 自减 | 同上 |
2 | & | 取地址符 | &name获得name的地址 |
2 | (类型) | 类型转换 | (int)age |
2 | sizeof | 长度 | sizeof(char) |
2 | - | 负号 | -5 |
2 | * | 指针 | *p |
3 | * | 乘 | 1*2 |
3 | / | 除 | 2/1 |
3 | % | 模 | 5%3=2 |
4 | + | 加 | 5+3=8 |
4 | - | 减 | 5-3=2 |
7 | == | 等于 | if(2==1)break; |
7 | != | 不等于 | if(2!=1)break; |