c++基础(一)数据类型
#include<iostream> //包含头文件,iostream标准的输入输出流
using namespace std; //使用命名空间,;分号作为语句的结束
int main()
//c++程序中只有一个main函数,是程序的入口,main是函数名,int是返回值类型,()中可添加形参
{
cout<<"hello wrold"<<endl;
//cout输出设备,屏幕,endl换行
return 0;
/*return将其后的表达式结果或数值,作为函数的返回值返回,return结束当前函数*/
}
关键字
asm | do | if | return | typedef |
---|---|---|---|---|
auto | double | inline | short | typeid |
bool | dynamic_cast | int | signed | typename |
break | else | long | sizeof | union |
case | enum | mutable | static | unsigned |
catch | explicit | namespace | static_cast | using |
char | export | new | struct | virtual |
class | extern | operator | switch | void |
const | false | private | template | volatile |
const_cast | float | protected | this | wchar_t |
continue | for | public | throw | while |
default | friend | register | true | |
delete | goto | reinterpret_cast | try |
整形常量
二进制:是以0b开头,如0b00001010
十进制: 以正常数字1-9开头,如457 789
八进制: 以数字0开头,如0123
十六进制:以0x开头,如0x1e
a=10,b=11,c=12, d=13,e=14,f=15
c++不直接支持二进制的输入输出,cout默认是将数据以十进制输出,如果需要将数据以八进制、十六进制输出需要加上oct、hex,十进制dec
#include<iostream>
#include<bitset> //必要的头文件
using namespace std;
int main()
{
cout<<oct<<0123<<endl; //cout需要使用oct输出八进制,以数字0开头
cout<<hex<<0x123ef<<endl; //cout需要使用hex输出十六进制,以0x开头
cout<<bitset<8>(0b01010101)<<endl;//bitset<位数>(数值),位数一般都是8、16、32
return 0;
}
整形变量
变量名的命名规则:由字母、数值、下划线(_)组成,不能由数值开头,不可以是关键字,区分大小写。
C++ 对于名称的长度没有限制,名称中所有的字符都有意义,但有些平台有长度限制。
整形变量的初始化
变量的初始化:在变量定义的时候,给变量赋值 叫初始化
全局变量如果不初始化内容为0
局部变量如果不初始化内容为不确定(随机)
整型变量的使用
读和写(取值和赋值)
int num = 0; //变量定义的时候,系统会给变量开辟空间,空间的大小取决于变量的类型,int就是4个字节
num=100;//写操作
int data = 0;
data = num;//num读 data写
cout<<data<<endl;//读操作
变量的声明:对变量名以及类型 提前说明,不会为该变量开辟空间。先使用变量 后定义变量 必须事先对该变量进行声明.
#include <iostream>
using namespace std;
extern int num; //先声明
int main(int agrc, char *argv[])
{
cout<<"num="<<num<<endl;//再使用
return 0;
}
int num=10;//最后定义,先定义后使用就不需要声明了
变量的定义:创建变量名 系统会为变量开辟空间
变量的声明:对变量的类型和名称 事先说明,不会为变量创建空间
变量的使用:对已经存在的变量的读写操作
字符常量
用单引号括起来,如:‘a’、‘b’、’0’等。注意单引号只能作用于一个字符(转义字符除外)
cout<<'a'<<endl;//输出的是字符
cout<<(int)'a'<<endl;//输出的是字符的ASCII值
字符变量
用char定义,每个字符变量被分配一个字节的内存空间字符值以ASCII码的形式存放在变量的内存单元
中。
char ch;
ch= 'x';//ch变量中存放的是字符'x'的ASCII :120,相当于ch=120
char ch='\0';//字符变量的初始化
'\0'和‘0’、数值0的区别
‘\0’字符常量(char) ASCII为0
数值0 是整型常量(int) 内存的存储值0
'0'字符常量(char)ASCII 为48
字符常量和字符串常量的区别
每个字符串的结尾,编译器会自动的添加一个结束标志位'\0',
‘a’为字符常量,”a”为字符串常量
“a”包含两个字符‘a’和’\0’
实型(浮点数)
单精度浮点数(float 4字节) 是双精度浮点数(double 8字节)
不以f结尾的实型常量为double类型 如:3.14
以f结尾的实型常量为float类型 如:3.14f
指数形式: 123e3 代表 123*10 的三次方 ,123e-3表示123 乘10的负三次方
实型变量初始化
float f=0.0f;//单精度实型变量:float f; 占4字节 以f结尾的实型常量初始化
double d=0.0;//双精度实型变量:double d;占8字节 不以f结尾的实型常量初始化
有符号数和无符号数
有符号数
数据二进制的最高位为符号位 其他位为数据位。
最高位为1 表示负数
最高位为0 表示正数
无符号数:没有符号位 所有二进制位都是数据位
int num;//默认num为有符号数
signed int num;//signed定义有符号数
unsigned int num;//unsigned定义无符号数
原码,反码,补码
负数在计算机以补码的方式存储
非负数在计算机以原码的方式存储
关于补码
1、统一了0的编码
2、将减法运算变加法运算
存储方式
负数在计算机以补码的方式存储
非负数在计算机以原码的方式存储
八进制数 以原码存储
十六进制 以原码存储
取值方式
如果是对 无符号变量 进行取值,输出内存的原样数据。
如果是对 有符号变量 进行取值,系统会去看内存的最高位,如果最高位为0 表明正数, 内存原样 输
出。
系统会去看内存的最高位,如果最高位为1 表明负数, 将内存数据求补码(得到原码) 输出
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
//先将-10转成无符号数(-10的补码)
unsigned short data = -10;//原码1000 0000 0000 1010 补码1111 1111 1111 0110
short data2=-10;//补码1111 1111 1111 0110 负数在计算机以补码的方式存储
cout<<bitset<16>(data)<<endl;//1111 1111 1111 0110
cout<<bitset<16>(data2)<<endl;//1111 1111 1111 0110
cout<<"data="<<data<<endl;//65526==1111 1111 1111 0110 输出内存的原样数据,全部是数据位
cout<<"data2="<<data2<<endl;//-10==1111 1111 1111 0110 根据最高位,原码输出
return 0;
}
const修饰普通变量
如果以常量初始化 const修饰的只读变量 那么 只读变量的值 事先存放在“符号常量表中” 不会立即给data
开辟空间
#include <iostream>
#include <bitset>
using namespace std;
int main()
{ const int data=10;//以常量初始化 const修饰的只读变量 ,事先存放在“符号常量表中”
int*p=(int*)&data;//取地址开辟空间
*p=100; //在空间中赋值100
cout<<data<<endl;//10,data从符号常量表中取值
cout<<*p<<endl;//100,从为data开辟的空间中取值
int a=10;
const int data2=a;//以变量a初始化data2,会立即开辟空间
int* q=(int*)&data2;
*q=100;
cout<<data2<<endl;//100,从为data开辟的空间中取值
cout<<*q<<endl;//100,从为data开辟的空间中取值
return 0;
}
当对data取地址时 系统才会为data开辟空间
如果以变量初始化 const修饰的只读只读变量 那么只读变量会立即开辟空间(没有符号常量表)
const修饰自定义类型变量 立即开辟空间 (没有符号常量表)
register修饰寄存器变量
如果变量 别高频繁使用 会自动将变量存储在寄存器中 目的:提高访问效率
如果用户想将变量 直接放入寄存器中 可以加register修饰
register int data=0;//data将放入寄存器中
//尽量不要对寄存器变量取地址
&data;
//register修饰的变量 只是尽量放入寄存器中,不一定放成功
volatile 关键字
强制访问内存
防止编译器优化
volatile int data=0;//对data的访问 必须从内存访问取值,
sizeof测量类型的大小
cout<<sizeof('a')<<endl;//1B
cout<<sizeof(10)<<endl;//4B
cout<<sizeof(short)<<endl;//2B
cout<<sizeof(long)<<endl;//32位平台 4B
cout<<sizeof(float)<<endl;//4B
cout<<sizeof(double)<<endl;//8B
typedef给已有的类型重新取个别名
typedef作用的步骤:
1、先用 已有的类型 定义一个普通的变量 int a;
2、用别名 替换 变量名 int INI32;
3、在整个表达式最前方 加typedef type int INI32;
//INT32就是int类型的别名
typedef int INT32;
INT32 data;
int num;//已有的类型任然有效
\和某些字符 结合 产生新的字符 就叫转义字符
'\0' == ASCII 为0
'\n' == 换行符
'\t' == tab缩进符
'\r' ==回到行首符号
'\a' ==发出警报
八进制转义
'\ddd' 每个d的范围必须是0~7 3个d表示最多识别3位八进制数据
十六进制转义
'\xhh' 每个h的范围0~9 a~f 2个h表示最多识别2位十六进制
类型转换
不同类型数据之间进行混合运算时必然涉及到类型的转换问题。
自动转换:
遵循一定的规则,由编译系统自动完成.
强制类型转换:
把表达式的运算结果强制转换成所需的数据类型
自动类型转换原则
占用内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降低。
无符号和有符号 参加运算 需要将有符号 转换成无符号
int和double参加运算 会将int转成从double类型
char和short类型 只要参加运算 都会将自己转换成int类型
强制类型转换
(类型说明符) (表达式)
功能:
把表达式的运算结果强制转换成类型说明符所表示的类型
(int)p+1 对p强转成int类型 然后再+1
(int)(p+1)对p+1强转成int类型
float f=3.14f;//不管是自动类型转换 还是强制类型转换 都是临时。
int x = 0;
x = (int)f;
cout<<"x ="<<x<<", f="<<f<<endl;//x =3, f=3.14