基础语法入门
文章目录- 一、初识C++
- 1.1 新建项目
- 1.2 编写项目
- 1.3 运行程序
- 1.4 注释
- 1.5 变量
- 1.6 常量
- 1.7 关键字
- 1.8 标识符命名规则
- 二、数据类型
- 2.1 整型
- 2.2 sizeof关键字
- 2.3 实型(浮点型)
- 2.4 字符型
- 2.5 转义字符
- 2.6 字符串型
- 2.7 布尔类型 bool
- 2.8 数据的输入
- 三、运算符
- 3.1 算数运算符
- 3.2 赋值运算符
- 3.3 比较运算符
- 3.4 逻辑运算符
- 四、程序流程结构
- 4.1 选择结构
- 4.1.1 if 语句
- 4.1.2 三目运算符
- 4.1.3 switch语句
- 4.2 循环结构
- 4.2.1 while循环语句
- 4.2.2 do...while循环语句
- 4.2.3 for循环语句
- 4.2.4 循环嵌套
- 4.3 跳转语句
- 4.3.1 break语句
- 4.3.2 continue语句
- 4.3.3 goto语句
- 五、数组
- 5.1 概述
- 5.2 一维数组
- 5.2.1 一维数组定义方式
- 5.2.2 一维数组数组名
- 5.2.3 冒泡排序
- 5.3 二维数组
- 5.3.1 二维数组的定义方式
- 5.3.2 二维数组数组名
- 5.3.3 二维数组应用案例
- 六、函数
- 6.1 概述
- 6.2 函数的定义
- 6.2 函数的调用
- 6.4 值传递
- 6.5 函数的常见样式
- 6.6 函数的声明
- 6.7 函数的分文件编写
- 七、指针
- 7.1 指针的基本概念
- 7.2 指针变量的定义和使用
- 7.3 指针所占内存空间
- 7.4 空指针和野指针
- 7.5 const修饰指针
- 7.6 指针和数组
- 7.7 指针和函数
- 7.8 指针、数组、函数
- 八、结构体
- 8.1 结构体基本概念
- 8.2 结构体定义和使用
- 8.3 结构体数组
- 8.4 结构体指针
- 8.5 结构体嵌套结构体
- 8.6 结构体做函数参数
- 8.7 结构体中的const使用场景
- 8.8 结构体案例
- 8.8.1 案例1
- 8.8.2 案例2
一、初识C++ 1.1 新建项目以下内容均来自B站黑马程序员C++,小张大三了由于中途转专业需要补修课程所以自学C++,写了这份笔记以及一些思考,看到好多人要讲义,所以在此分享,在学习C++之前,接触过JAVA、python、操作系统、计算机组成原理…为什么高校大一就学C++呢,我虽然先学的别的但深有体会,编程语言大多都是基础语法与面向对象,他们其实很类似的,而C++又是编程中最最最基础的语言,学好C++之后的其它编程语言都可以轻松上手,而且操作系统、计组又可以解释他们的底层逻辑(例如我写的2.1),看不懂也没关系,这门课重在让大家入门学习。
为什么选择黑马?因为我的JAVA也是跟着黑马学的,他真的对小白很友好,所以建议各位同学可以跟着B站边看边敲,真的很有用!
文件→新建→项目→Visual C++→空项目→填写信息→确定
右击源文件→添加→新建项→命名→添加
1.2 编写项目main是一个程序的入口,每个程序都必须有一个main函数,有且仅有一个
#include//头文件 using namespace std; int main() { cout << "hello world" << endl; system("pause"); return 0; }
1.3 运行程序输出结果
- hello world
输出第一个C++程序。F5运行程序
1.4 注释作用: 在代码中加一些说明和注释,方便自己或其它程序员阅读代码。编译器在编译代码时,会忽略注释的内容。
- 单行注释//xxx
通常在一行代码的上方,或者一条语句的末尾。对该行代码说明
- 多行注释:
通常在一段代码的上方,对该段代码做整体说明
1.5 变量作用: 给一段指定的内存空间起名,方便操作这段内存
语法:数据类型 变量名 = 初始值;
eg:
int main()
{
//变量创建的语法:数据类型 变量名 = 初始值
int a = 10;
cout << "a = " << a << endl;
system("pause");
return 0;
}
1.6 常量输出结果
- a = 10
作用: 用于记录程序中不可更改的数据
定义方式:
-
#define 宏常量:define 变量名 常量值
==通常在文件上方定义==,表示一个常量
-
const修饰的变量const 数据类型 常量名 = 常量值
通常在变量定义前加关键字const,修饰该变量为常量,不可修改
eg:
//1.#define 宏常量
#define day 7
int main()
{
//day = 8; //报错,宏常量不可以修改
cout << "一周有" << day << "天" << endl;
//2.const修饰变量
const int month = 12;
//month = 13; //报错,const修饰的变量也称为常量
cout << "一年有" << month << "个月" << endl;
system("pause");
return 0;
}
1.7 关键字输出结果
- 一周有7天
一年有12个月
作用: 关键字是C++中预先保留的单词(标识符)
- 在定义变量或者常量的时候,不要用关键字
C++关键字如下
| asm | do | if | return | typedef |
|---|---|---|---|---|
| auto | double | inline | short | typeld |
| bool | dynamic_cast | int | signed | typename |
| break | else | long | sizeof | union |
| case | enum | mutable | static | unsigned |
| catch | explicit | namespace | static_cast | 实验六 三维图形修改器的综合应用 |
| char | export | new | struct | virtual |
| class | exterm | operator | switch | void |
| const | false | private | template | volatile |
| const_cast | float | potected | this | wchar_t |
| continue | for | public | throw | while |
| default | friend | register | true | |
| delete | goto | reinterpret_cast | try |
在给变量或者常量起名称的时候,不要用C++的关键字,否则会产生歧义
int main()
{
//创建变量:数据类型 变量名称 = 变量初始值
//不要用关键字给变量或者常量起名称
int int = 10; //报错,第二个int是关键字,不可以作为变量的名称
system("pause");
return 0;
}
1.8 标识符命名规则
作用: C++规定给标识符(变量、常量)命名时,有一套自己的规则
- 标识符不能是关键字
- 标识符只能由字母、数字、下划线组成
- 第一个字符必须为字母或下划线
- 标识符中字母区分大小写
给标识符命名时,争取做到见名知意的效果,方便自己和他人的阅读
int main()
{
//1.标识符不能是关键字
//int int =1;
//2.标识符只能由字母、数字、下划线组成
//3.第一个字符必须为字母或下划线
int aa = 1;
int a1 = 2;
int a_b = 3;
int a_b1 = 4;
int _a = 5;
//int 1a = 6;
//4.标识符中字母区分大小写
int a = 100;
//cout << A << endl; //A和a不是同一个名称
system("pause");
return 0;
}
二、数据类型
C++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存
2.1 整型作用: 整型变量表示的是数据类型的数据
C++中能够表示整型的类型有以下几种方式,区别在于所占内存空间不同:
| 数据类型 | 占用空间 | 取值范围 |
|---|---|---|
| short(短整型) | 2字节 | (-215~215-1) |
| int(整型) | 4字节 | (-231~231-1) |
| long(长整型) | Windows为4字节,32位Linux为4字节,64位Linux为8字节 | (-231~231-1) |
| long long(长长整型) | 8字节 | (-263~263-1) |
Q:初学者可能不明白这里的内存空间和字节是什么意思?
A:计算机使用2进制计数来记录信息,1字节=8字(1B=8bit),例如int整型,4个字节占用32个字,第一位用来表示符号位,其余的31位用来表示数值。0本来既不是正数,也不是负数,它占用了0000(十六进制0)的位置,因此正数个数比负数少一个,int取值范围是(-231~231-1)
Q:为什么是2x?
A:2x,表示有x位二进制。例如22,表示00,01,10,11。即0,1,2,3
以后学了《计算机组成原理》或者《操作系统》就明白了,初学不用纠结这个计算问题
eg:取值范围越界
int main()
{
//short的取值范围(-2^31^~2^31^-1)即(-32768~32767)
short num = 32768;
cout << num << endl;
system("pause");
return 0;
}
输出结果
- -32768
2.2 sizeof关键字取值范围越界就好比十进制计算,给计算机分配了一个字,现在1+9需要进位,但只有一个字,所以1+9=0
再或者理解为所有的取值范围画在一块表上,它的加减计算就是指针的移动
《计算机组成原理》会详细讲解计算机利用"原码"、“补码”、“反码”计算加减乘除的原理。初学不用纠结这个问题
作用: 利用sizeof关键字可以统计数据类型所占内存大小
语法: sizeof (数据类型 / 变量)
eg:
int main()
{
int num = 1;
cout << "num 变量所占内存空间为:" << sizeof(num) << "字节" << endl;
cout << "short 类型所占内存空间为:" << sizeof(short) << "字节" << endl;
cout << "int 类型所占内存空间为:" << sizeof(int) << "字节" << endl;
cout << "long 类型所占内存空间为:" << sizeof(long) << "字节" << endl;
cout << "long long 类型所占内存空间为:" << sizeof(long long) << "字节" << endl;
system("pause");
return 0;
}
2.3 实型(浮点型)输出结果
- num 变量所占内存空间为:4字节
short 类型所占内存空间为:2字节
int 类型所占内存空间为:4字节
long 类型所占内存空间为:4字节
long long 类型所占内存空间为:8字节
作用: 用于表示小数
浮点型变量分为两种:
- 单精度float
- 双精度double
两者的区别在于表示的有效数字范围不同。有效数字包括整数和小数部分。
| 数据类型 | 占用空间 | 有效数字范围 |
|---|---|---|
| float | 4字节 | 7位有效数字 |
| double | 8字节 | 15~16位有效数 |
以下在大二上《计算机组成原理》会讲到,初学无需理解
A:为什么float是7位有效数字,double是15~16位有效数字?
Q1:以float为例,4字节=32位。1位符号位,8位指数位,23位尾数位。223=8388608,一共七位
数据类型 符号位 指数位 尾数位 float 第31位(占1bit) 第30-23位(占8bit) 第22-0位(占23bit) double 第63位(占1bit) 第62-52位(占11bit) 第51-0位(占52bit) 符号位0 表示正数,1 表示负数。符号位之后的 指数位,决定了数字的范围。指数位之后的 尾数位,决定了数字的精度(即数学中指的保留几位数或有效数字)
Q2:以double为例,双精度浮点型的数转化成二进制的数保存,读取时根据指数位和尾数位的值转化成双精度浮点数
比如说存储 8.8125 这个数,它的整数部分的二进制是 1000,小数部分的二进制是 1101。这两部分连起来是 1000.1101,但是存储到内存中小数点会消失,因为计算机只能存储 0 和 11000.1101 这个二进制数用科学计数法表示是 1.0001101 * 23,这里的 3(进制是 0011)即为指数
现在符号位是 0,尾数位就是科学计数法的小数部分 0001101。指数位用来存储科学计数法的指数,此处为 3。指数位有正负,11 位指数位表示的指数范围是 -1023(-210-1)~1024(210)可以判断数值的最大值为 53 位二进制的最大值: 253 -1
PS:科学计数法中小数点前的 1 可以省略,因为这一位永远是 1。0.5 二进制科学计数为 1.00 * 2-1
Q3:最后来说一下浮点数精度的问题。很多人都知道,两个浮点数相加时,结果会有一些误差。比如 0.1 + 0.2 的结果是 0.30000000000000004
这是因为 0.1 和 0.2 用二进制表示时为 0.0001 1001 1001 1001…(1100循环) 和 0.0011 0011 0011 0011…(0011循环)。如果截取于第 52 位,就会得到一个有误差的结果
eg:
int main()
{
//默认情况下,输出一个小数,会显示6位有效数字
float f1 = 3.1415926f; //不加f默认是double类型。删掉f,鼠标放在3.14可以查看类型
double d1 = 3.1415926;
cout << "f1=" << f1 << endl;
cout << "d1=" << d1 << endl;
//统计float和double占用内存空间
cout << "float所占内存空间为:" << sizeof(f1) << "字节" << endl;
cout << "double所占内存空间为:" << sizeof(d1) << "字节" << endl;
//科学计数法
float f2 = 3e2; //3*10^2
float f3 = 3e-2; //3*10^-2
cout << "f2=" << f2 << endl;
cout << "f3=" << f3 << endl;
system("pause");
return 0;
}
输出结果
- f1=3.14159
d1=3.14159
float所占内存空间为:4字节
double所占内存空间为:8字节
f2=300
f3=0.03
2.4 字符型总结:float变量不加f默认是double类型
作用: 字符型变量用于显示当个字符
语法:char 变量名称 = '字符';
注意:在显示字符型变量时,用单引号将字符括起来,不要用双引号
注意:单引号内只能有一个字符,不可以是字符串
- C和C++中字符型变量只占用1个字符
- 字符型变量并不是把字符本身放到内存中存储,而是将对应的ASCII码放在存储单元中(Alt+ASCII可以转换对应字符,eg:长按alt+65=A)
eg:
int main()
{
//1.字符型变量 char 变量名 = '字符'
char ch = 'A';
cout << ch << endl;
//2.字符型变量所占内存大小
cout << "char字符型变量所占内存:" << sizeof(char) << endl;
//3.字符型变量常见错误
//ch = "b"; //错误,不可以用双引号
//ch = 'abcd'; //错误,单引号只能引用一个字符
//4.字符型变量对应ASCII码
cout <<"ch 所对应的ASCII码:"<< (int)ch << endl; //将字符对应的ASCII码强转换成int型
system("pause");
return 0;
}
输出结果
- A
char字符型变量所占内存:1
ch 所对应的ASCII码:65
2.5 转义字符扩展:ASCII码字符对照表
- ASCII非打印控制字符:ASCII表上的数字0-31分配给了控制字符,用于控制像打印机等一些外围设备
- ASCII打印字符:数字32-126分配给了能在键盘上找到的字符,当查看或打印文档时就会出现
作用:用于表示一些不能显示出来的ASCII字符
现阶段我们常用的转义字符有:\、t、n
| 转义字符 | 含义 | ASCII码值(十进制) |
|---|---|---|
| a | 警报 | 007 |
| b | 退格(BS) ,将当前位置移到前一列 | 008 |
| f | 换页(FF),将当前位置移到下页开头 | 012 |
| n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
| r | 回车(CR) ,将当前位置移到本行开头 | 013 |
| t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
| v | 垂直制表(VT) | 011 |
| \\ | 代表一个反斜线字符"" | 092 |
| ' | 代表一个单引号(撇号)字符 | 039 |
| " | 代表一个双引号字符 | 034 |
| ? | 代表一个问号 | 063 |


