C++基础入门[上]
第一章 初识C++
1.第一个C++程序
/*include:引入库文件并替换
namespace:命名空间
main:主函数 程序的入口
():函数固定写法,可以放参数
int:函数的返回值类型
{}:函数主体
;程序语句的分割
cout:输出语句
endl:换行语句
return:函数返回结果
*/
#include<iostream>
using namespace std;
int main(){
cout<<"hello world"<<endl;
return 0;
}
2.C++程序编译过程及原理
- 编译过程
- 预编译
展开头文件、宏定义;#define #ifdef #include;若有.h文件,也会包含进来。 - 编译
已经预编译的文件编译成汇编代码的过程,整个过程包括语法、词法的分析,和一些优化操作。 - 汇编
变成目标代码,二进制文件。 - 链接
将单个编译后的文件链接成一个可运行文件。 - 过程框图
3.C++能做什么
- 设备驱动程序
- 操作系统领域
- 科学计算
- 嵌入式领域
- 游戏开发领域
- 虚拟现实
- 网络软件
第二章 C++基础语法
1.注释的好处
被注释的代码不会被执行,编译器也不会进行编译
- 提高代码的可读性
- 方便调试代码
- 禁止无关程序执行
单行注释
//我是单行注释
多行注释
/*
我是注释不会被编译
多行注释
*/
2.C++基础梳理
- 表达式
某个动作称之为表达式
比如:int a=10; int b=20; int c=a+b - 语句
以分号结尾的表达式称之为语句
int a=10;
int b=20;
int c=a+b; - 标识符
上面的a、b、c称之为标识符。它定义了计算机内存的一块区域,与名称相关联。10、20为常量 - 赋值
int a=10;其中a=10为赋值语句,把10赋值给a相关的区域。 - 入口函数
C++程序从main()函数的第一条语句开始执行 - 函数
函数由四部分组成 返回类型 函数名 参数表 以及函数体 前三部分合起来称为函数原型。参数表由小括号括起来 包含一个或多个由逗号分开的参数 函数体由一对花括号括起来,由程序语句序列构成。 - 输出函数
输出内容,cout<<""<<endl;
3.C++必知必会
- void
无值型,void类型其实是一种用于语法性的类型,而不是数据类型,主要用于作为函数的参数或返回值,或者定义void指针,表示一种未知类型。
func(void);
在c++中如果参数列表为空,默认的参数类型即为void,但建议没有参数时使用void以提高程序的可读性。
#include<iostream>
using namespace std;
int main(void){
cout<<"hello world"<<endl;
return 0;
}
- 头文件
abc.h 可以声明变量和函数,让多个.cpp文件引用代码 - 源文件
abc.cpp 写业务逻辑的文件 - #include
#include 是预处理器指示符它把iostream的内容读入我们的文本文件中。iostream是输入输出流库标准文件,包含cout的信息,它对我们的程序是必需的。预处理指示符用#号标识。 - namespace
命名空间,减少和避免命名冲突,指的是标识符的可见范围。using namespace std;using指示符告诉编译器要使用在命名空间std中声明的名字。
4.C++头文件的作用
- 一般在头文件中,只声明函数和变量,而不进行定义
- 声明: extern int a;和int f();
- 定义:如果写上int a;或者int f(){}
例子如下:
//abc.h
#include<iostream>
using namespace std;
/*
声明工作能力
*/
int work();
//work.cpp
#include "abc.h"
int work(){
cout<<"在学校";
return 0;
}
//main.cpp
#include "abc.h"
#include<iostream>
using namespace std;
int main(void){
work();
cout<<"学习";
return 0;
}
5.输入输出初探
C++的输入/输出功能由输入/输出流iostream 库提供,所以要使用输入输出必须添加头文件#include< iostream >
- 输出 cout
输出操作符:<<
语法:cout<<表达式1<<表达式2<<表达式3…表达式n; - 换行符 endl
- 输入 cin
输入操作符:>>
语法:cin>>变量1>>变量2…变量n;
示例:
#include<iostream>
using namespace std;
/*
endl为换行符
*/
int main(void){
cout<<"hello 你好"<<endl;
//声明一个变量存储空间
int x;
cout<<"请输入内容:"<<endl;
//输入内容存储到x中去
cin>>x;
//取出存好的数据
cout<<"取到x:"<<x<<endl;
return 0;
}
第三章 C++数据类型
1.进制基本介绍
进制就是进位计数制,对于任何一种进制X进制,就表示每一位置上的数运算时都是逢X进一位。十进制就是逢十进一,十六进制就是逢十六进一,以此类推,X进制就是逢X进位。
常见进制
- 二进制
由两个数码0、1组成,二进制数运算规律是逢二进一。
- 八进制
一种以8为基数的计数法,逢八进一。O代表八进制
- 十进制
满十进一 - 十六进制
十六进制在数学中是一种逢16进1的进位制。一般由数字0到9和字母A到F(a~ f)表示,其中:A~F表示10 ~15,这些称作十六进制数字。
例:0x5A3 其中“x”则代表十六进制
2.原码反码补码
-
原码
⑴原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值,比如8位二进制:
[+1]原=00000001
[-1]原=10000001
⑵原码是人脑最容易理解和计算的表示方式 -
反码
⑴ 正数的反码是其本身
⑵ 负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
[+1]=[00000001]原=[00000001]反
[-1]=[10000001]原=[11111110]反
⑶ 可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值,通常要将其转换成原码再计算。 -
补码
⑴ 正数的补码就是其本身
⑵ 负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。(即在反码的基础上+1)
[+1]=[00000001]原=[00000001]反=[00000001]补
[-1]=[10000001]原=[11111110]反=[11111111]补
⑶ 对于负数,补码表示方式也是人脑无法直观看出其数值的,通常也需要转换成原码再计算其数值 -
转换
⑴ 已知原码求补码
X为负数。求其反码时,符号位不变,数值部分按位取反;求其补码时,再在其反码的末位加1.
X的原码为10110100B
[X]反=11001011B,[X]补=11001100B
⑵ 已知补码,求原码
对 二进制数来说,先减1后取反和先取反后加1得到的结果是一样的,故仍可采用取反加1的方法。
已知[X]补=11101100,求[X]原。[X]原=10010100
3.基本数据类型之整型
即整数类型
- 分类
按符号分有符号和无符号
按长度分普通整型、短整型、长整型 - 整型类别
- 代码显示
#include<iostream>
using namespace std;
int main(void){
cout<<"int:"<<sizeof(int)<<endl;
cout<<"unsigned int:"<<sizeof(unsigned int)<<endl;
cout<<"short int:"<<sizeof(short int)<<endl;
cout<<"unsigned short int:"<<sizeof(unsigned short int)<<endl;
cout<<"long int:"<<sizeof(long int)<<endl;
cout<<"unsigned long int:"<<sizeof(unsigned long int)<<endl;
return 0;
}
4.基本数据类型之单浮点型
- 浮点型
单精度
双精度
长双精度 - 单精度
float x=2.59f
使用关键字float,后面要添加f,内存占4个字节。
注意:一定要在后面添加f否则默认是双精度 - 代码显示
#include<iostream>
using namespace std;
int main(void){
float x=2.59f;
cout<<"float:"<<sizeof(float)<<",x:"<<x<<endl;
return 0;
}
- 单精度存储方式
存储方式遵从IEEE的规范
在存储中都分为三个部分:符号位、指数位、尾数部分
符号位:0代表正,1代表负
指数位:用于存储科学计数法中的指数数据,并且采用移位存储
尾数部分:尾数部分 - 算出对应的十进制数
0 10000010 01000100000000000000000
第一步:符号位为0,表示正数;
第二步:指数位为10000010,换算成十进制130,所以指数为130-127=3;
第三步:尾数位为01000100000000000000000,换算成十进制为(1+1/4+1/64),尾数部分都要加1;
十进制数值为:2^3*(1+1/4+1/64)=8+2+1/8=10.125
5.基本数据类型之双浮点型
- 双浮点型
使用关键字double,内存中占8个字节 - 声明一个双浮点数
double a=5.63 - 代码显示
#include<iostream>
using namespace std;
int main(void){
double a=5.63;
cout<<"double:"<<sizeof(double)<<",a:"<<a<<endl;
return 0;
}
- 双精度的存储方式
在存储中都分为三个部分:符号位、指数位、尾数部分
符号位:0代表正,1代表负
指数位:用于存储科学计数法中的指数数据,并且采用移位存储
尾数部分:尾数部分
6.基本数据类型之字符型
采用关键字char,字符数据使用单引号包围,占用一个字节,取值范围-128~127。
- 定义一个字符
char ch1=‘a’;
#include<iostream>
using namespace std;
int main(void){
char ch1='a';
cout<<"char:"<<sizeof(char)<<",ch1:"<<ch1<<endl;
return 0;
}
- 代码显示
字符数据在内存中存储的是字符的ASCII码,即一个无符号整数,所以可以直接把整数赋值给字符变量。
比如:
char ch1=‘a’;
char ch2=97; - 代码显示
#include<iostream>
using namespace std;
int main(void){
char ch1='a';
char ch2=97;
cout<<"char:"<<sizeof(char)<<",ch1:"<<ch1<<endl;
cout<<"char:"<<sizeof(char)<<",ch2:"<<ch2<<endl;
return 0;
}
7.基本数据类型之宽字符型
- 宽字符型
关键字wchar_t,占用2个字节。一种扩展的存储方式。
char是8位字符类型,最多只能包含256中字符,许多外文字符集所含的字符数目超过256个,char型无法表示。
wchar_t数据类型一般为16位或32位,但不同的C或C++有不同的规定。 - 代码显示
#include<iostream>
using namespace std;
int main(void){
wchar_t ch3='b';
cout<<"wchar_t:"<<sizeof(wchar_t)<<",ch3:"<<ch3<<endl;
return 0;
}
8.基本数据类型之布尔型
bool类型用来表示真假,也即是1、0,占用1个字节。
- 代码显示
#include<iostream>
using namespace std;
int main(void){
bool a=true;
bool b=1;
bool c=false;
bool d=0;
cout<<"bool:"<<sizeof(bool)<<",a:"<<a<<endl;
cout<<"bool:"<<sizeof(bool)<<",b:"<<b<<endl;
cout<<"bool:"<<sizeof(bool)<<",c:"<<c<<endl;
cout<<"bool:"<<sizeof(bool)<<",d:"<<d<<endl;
return 0;
}
9.派生数据类型
-
指针类型
通常所说的指针就是指针变量,它是一个专门存储地址的变量,变量的指针主要指变量在内存中的地址。int a=10; int* p; p=&a;
-
枚举类型
枚举就是取有限个值,确定列举出来的几个值。
比如周一到周六enum Week{Monday,Tuesday,.....Sunday};
-
数组类型
将同一类型的数据按照一定的形式有序的组织起来,这些有序数据的集合就称之为数组。 -
结构体类型
由各种数据类型组合起来的数据集合
struct man{
int age;
char name[20];
short sex;
}
- 共同体类型
将不同数据项组成一个整体,和结构体有点类似,但是在内存中占用首地址相同的一段存储单元。注意:每个瞬间只能存储一种数据类型
union myClass{
int a;
char b;
float c;
};
- 类类型
万物皆是类型,皆是对象。
10.typedef关键字使用
可以用typedef为一个已有的类型取一个新的名字。
语法: typedef type newname;
例: typedef int abc;
- 代码显示
#include<iostream>
using namespace std;
int main(void){
typedef int myint;
myint a=23;
cout<<"myint:"<<sizeof(myint)<<",a:"<<a<<endl;
typedef float myfloat;
myfloat b=2.33f;
cout<<"myfoat:"<<sizeof(myfloat)<<",b:"<<b<<endl;
typedef double mydouble;
mydouble c=2.33;
cout<<"mydouble:"<<sizeof(mydouble)<<",c:"<<c<<endl;
typedef char mychar;
mychar d='u';
cout<<"mychar:"<<sizeof(mychar)<<",d:"<<d<<endl;
typedef bool mybool;
mybool e=false;
cout<<"mybool:"<<sizeof(mybool)<<",e:"<<e<<endl;
return 0;
}
11.数字型常量
-
定义
程序运行中不可改变的值 -
常量的类型
-
整型常量
比如 0 3 100 -2 -
进制表示
二进制
int i=0b1101;//13
需要在常数前面加0b来代表二进制
八进制
int k=012;//10
需要在常数前面加0来代表八进制
十六进制
int h=0x1a;//26
需要在常数前面加0x来代表十六进制 -
浮点型常量
由整数和小数组成
小数方式
double a=23.56;
指数方式
double b=2.14e2;//214 -
布尔型常量
bool ,真和假。bool a=true; -
宏定义常量
例:#define PI 3.1415926
#include<iostream>
using namespace std;
//宏定义
#define PI 3.14
int main(void){
cout<<"PI:"<<PI<<endl;
return 0;
}
12.字符常量
字符常量是用单引号括起来的一个字符。例:char c=‘a’; 其中a就是一个常量。
- 转义字符
转义字符是特殊的字符常量,用\代表转义开始
代码显示
#include<iostream>
using namespace std;
int main(void){
//警报铃声
cout<<"\a"<<endl;
// \n为换行符
cout<<"hello\n";
return 0;
}
- 字符串常量
字符串常量是用双引号括起来的字符序列。例:“abc”
字符串常量存储
系统会在字符串的末尾添加一个\0作为结束标志
13.字符常量和字符串常量的区别
using namespace std;
int main(void){
cout<<"字符常量A:"<<sizeof('A')<<endl;
cout<<"字符串常量A:"<<sizeof("A")<<endl;
return 0;
}
- 区别总结
1.字符常量使用的单引号,字符串常量使用的双引号
2.长度不同。字符常量只能用单引号括起来,也即是用1个长度,字符串长度可以为0,但是需要注意即使字符串常量只有一个字符,它的长度也是2因为还有一个\0。
3.存储的方式不同。字符常量存储的是ASCII,而字符串常量 存储的是有效字符还要存储\0。
14.变量是什么
在程序运行中可以改变的量。
- 标识符
也就是变量的名字
命名规则:
(1) 由字母、数字、下划线组成,不能以数字开头。
(2) 大小写字母代表不同的含义。
(3) 不能使用内置关键字。
(4) 尽量语义化的名字通过变量名字可以知道是做什么的。
#include<iostream>
using namespace std;
int main(void){
//驼峰命名法:第一个字母小写其他首字母大写
int wangSiYuAge=23;
cout<<wangSiYuAge<<endl;
return 0;
}
- 关键字
- 变量的声明
语法: [修饰符] 类型 标识符;
(1) 修饰符是可选的,可以没有
(2) 变量类型是数据类型
(3) 标识符是变量名字
(4) 例如 int a;
(5) 可以一次声明多个变量
(6) int a,b,c; - 变量赋值
int a;
a=4;
变量赋初值
int a=4;
可以多个一起赋值
int a=2,b=3,c=4;
15.变量的类型
整型变量、浮点型变量、字符型变量
#include<iostream>
using namespace std;
int main(void){
int a1=1;
unsigned int a2=2;
short a3=3;
unsigned short a4=4;
long a5=5L;
unsigned long a6=6;
float a7=7.12f;
double a8=8.12;
long double a9=9.36L;
char ch1='a';//97
cout<<"a:"<<ch1<<endl;
char ch2=ch1-32;//65
cout<<"A:"<<ch2<<endl;
return 0;
}
16.C++格式化输出
- 输出不同数据类型
cout<<22<<2.14<<true<<'A'<<"ABC"<<endl;
- 输出不同格式的数据
#include<iostream>
#include<iomanip>
using namespace std;
int main(void){
//输出类型
cout<<22<<2.14<<true<<'A'<<"ABC"<<endl;
//输出格式
int c1=685;
cout<<"c1:"<<showbase<<c1<<endl;//显示进制前缀
cout<<"c1:"<<dec<<setw(20)<<setfill('#')<<c1<<endl;//输出宽度为20的十进制,默认靠右
cout<<"c1:"<<dec<<setw(20)<<setiosflags(ios::left)<<setfill('*')<<c1<<endl;//输出宽度为20的十进制,靠左
cout<<"c1:"<<oct<<c1<<endl;//输出八进制
cout<<"c1:"<<hex<<c1<<endl;//输出十六进制
cout<<"c1:"<<hex<<setiosflags(ios::uppercase) <<c1<<endl;//输出大写十六进制
cout<<"c1:"<<dec<<showpos<<c1<<endl;//在非负数值中显示 +
cout<<"c1:"<<dec<<noshowpos<<c1<<endl;//在非负数值中不显示 +
double c2=123.456789123;
cout<<"c2:"<<c2<<<