基础语法入门
以下内容均来自B站黑马程序员C++,小张大三了由于中途转专业需要补修课程所以自学C++,写了这份笔记以及一些思考,看到好多人要讲义,所以在此分享,在学习C++之前,接触过JAVA、python、操作系统、计算机组成原理…为什么高校大一就学C++呢,我虽然先学的别的但深有体会,编程语言大多都是基础语法与面向对象,他们其实很类似的,而C++又是编程中最最最基础的语言,学好C++之后的其它编程语言都可以轻松上手,而且操作系统、计组又可以解释他们的底层逻辑(例如我写的基础语法入门2.1),看不懂也没关系,这门课重在让大家入门学习。
为什么选择黑马?因为我的JAVA也是跟着黑马学的,他真的对小白很友好,所以建议各位同学可以跟着B站边看边敲,真的很有用!
一、初识C++
1.1 新建项目
文件→新建→项目→Visual C++→空项目→填写信息→确定
右击源文件→添加→新建项→命名→添加
1.2 编写项目
main是一个程序的入口,每个程序都必须有一个main函数,有且仅有一个
#include <iostream> //头文件
using namespace std;
int main()
{
cout << "hello world" << endl;
system("pause");
return 0;
}
输出结果
- hello world
1.3 运行程序
输出第一个C++程序。F5
运行程序
1.4 注释
作用: 在代码中加一些说明和注释,方便自己或其它程序员阅读代码。编译器在编译代码时,会忽略注释的内容。
- 单行注释
//xxx
通常在一行代码的上方,或者一条语句的末尾。对该行代码说明
- 多行注释:
/*xxx*/
通常在一段代码的上方,对该段代码做整体说明
1.5 变量
作用: 给一段指定的内存空间起名,方便操作这段内存
语法:数据类型 变量名 = 初始值;
eg:
int main()
{
//变量创建的语法:数据类型 变量名 = 初始值
int a = 10;
cout << "a = " << a << endl;
system("pause");
return 0;
}
输出结果
- a = 10
1.6 常量
作用: 用于记录程序中不可更改的数据
定义方式:
-
#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;
}
输出结果
- 一周有7天
一年有12个月
1.7 关键字
作用: 关键字是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 | using |
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
取值范围越界就好比十进制计算,给计算机分配了一个字,现在1+9需要进位,但只有一个字,所以1+9=0
再或者理解为所有的取值范围画在一块表上,它的加减计算就是指针的移动
《计算机组成原理》会详细讲解计算机利用"原码"、“补码”、“反码”计算加减乘除的原理。初学不用纠结这个问题
2.2 sizeof关键字
作用: 利用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;
}
输出结果
- num 变量所占内存空间为:4字节
short 类型所占内存空间为:2字节
int 类型所占内存空间为:4字节
long 类型所占内存空间为:4字节
long long 类型所占内存空间为:8字节
2.3 实型(浮点型)
作用: 用于表示小数
浮点型变量分为两种:
- 单精度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
总结:float变量不加f默认是double类型
2.4 字符型
作用: 字符型变量用于显示当个字符
语法: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
扩展:ASCII码字符对照表
- ASCII非打印控制字符:ASCII表上的数字0-31分配给了控制字符,用于控制像打印机等一些外围设备
- ASCII打印字符:数字32-126分配给了能在键盘上找到的字符,当查看或打印文档时就会出现
2.5 转义字符
作用:用于表示一些不能显示出来的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 |
\0 |
数字0 | 000 |
\ddd |
8进制转义字符,d范围0~7 | 3位8进制 |
\xhh |
16进制转义字符,h范围09,af,A~F | 3位16进制 |
eg:
int main()
{
//反斜杠 错误,cout << "\" << endl;
cout << "\\" << endl;
//水平制表符 \t占八个字符,包括\t之前的字符个数 优点是数据输出整齐
cout << "123\tHelloWorld" << endl;
cout << "12345\tHelloWorld" << endl;
//换行符 两个效果相同
cout << "Hello\n" ;
cout << "Hello" << endl;
system("pause");
return 0;
}
输出结果
123 HelloWorld
12345 HelloWorld
Hello
Hello
2.6 字符串型
作用: 用于表示一串字符
两种风格
- C语言风格字符串:
char 变量名[] = "字符串值";
- C++风格字符串:
string 变量名 = "字符串值"
eg:
#include <iostream>
using namespace std;
#include <string>
int main()
{
//1.C语言风格字符串 char 字符串名[] = "xx"
//注意:等号后面要用双引号 包含起来字符串
char str[] = "Hello World";
cout << str << endl;
//2.C++风格字符串 用C++风格字符串时,要包含“#include <string>”头文件
string str2 = "Hello World";
cout << str2 << endl;
system("pause");
return 0;
}
输出结果
- Hello World
Hello World
2.7 布尔类型 bool
作用: 布尔数据类型代表真或假的值
bool类型只有两个值:
- true 真 (本质是1)
- false 假 (本质是0)
bool类型占1个字节大小
eg:
int main14()
{
//1.创建bool数据类型 本质上1 代表真 0代表假
bool flag = true;
cout << flag << endl;
flag = false;
cout << flag << endl;
//2.查看bool类型所占内存空间
cout << "bool类型所占内存空间" << sizeof(bool) << endl;
system("pause");
return 0;
}
输出结果
- 1
0
bool类型所占内存空间1
2.8 数据的输入
作用: 用于从键盘获取数据
关键字:cin
语法:cin >> 变量
eg:
int main()
{
//1.整型
int int_type;
cout << "请给整型变量int_type赋值:" << endl;
cin >> int_type;
cout << "整型变量int_type=" << int_type << endl<<endl;
//2.浮点型
float float_type;
cout << "请给浮点型变量float_type赋值:" << endl;
cin >> float_type;
cout << "浮点型变量float_type=" << float_type << endl << endl;
//3.字符型
char char_type;
cout << "请给字符型变量char_type赋值:" << endl;
cin >> char_type;
cout << "字符型变量char_type=" << char_type << endl << endl;
//4.字符串型
string string_type;
cout << "请给字符串型变量string_type赋值:" << endl;
cin >> string_type;
cout << "字符串型变量string_type=" << string_type << endl << endl;
//5.bool类型 不能赋值英文(英文字符全为假),非0的数值都表示真
bool bool_type;
cout << "请给字符串型变量bool_type赋值:" << endl;
cin >> bool_type;
cout << "字符串型变量bool_type=" << bool_type << endl << endl;
system("pause");
return 0;
}
输出结果
请给整型变量int_type赋值:
1
整型变量int_type=1请给浮点型变量float_type赋值:
3.14
浮点型变量float_type=3.14请给字符型变量char_type赋值:
a
字符型变量char_type=a请给字符串型变量string_type赋值:
hello
字符串型变量string_type=hello请给字符串型变量bool_type赋值:
1
字符串型变量bool_type=1
三、运算符
作用: 用于执行代码的运算
本章主要讲解以下几类运算符:
运算符类型 | 作用 |
---|---|
算术运算符 | 用于处理四则运算 |
赋值运算符 | 用于将表达式的值赋给变量 |
比较运算符 | 用于表达式的比较,并返回一个真值或假值 |
逻辑运算符 | 用于根据表达式的值返回真值或假值 |
3.1 算数运算符
作用: 用于处理四则运算
算数运算符包括以下符号:
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
+ | 正号 | +3 | 3 |
- | 负号 | -3 | -3 |
+ | 加 | 10 + 5 | 15 |
- | 减 | 10 - 5 | 5 |
* | 乘 | 10 * 5 | 50 |
/ | 除 | 10 / 5 | 2 |
% | 取模(取余) | 10 % 3 | 1 |
++ | 前置递增 | a=2; b=++a; | a=3; b=3; |
++ | 后置递增 | a=2; b=a++; | a=3; b=2; |
– | 前置递减 | a=2; b=–a; | a=1; b=1; |
– | 后置递减 | a=2; b=a–; | a=1; b=2; |
eg 1:加减乘除
int main()
{
//加减乘除
int a1 = 10;
int b1 = 3;
cout << a1 << "+" << b1 << "=" << a1 + b1 << endl;
cout << a1 << "-" << b1 << "=" << a1 - b1 << endl;
cout << a1 << "*" << b1 << "=" << a1 * b1 << endl;
cout << a1 << "÷" << b1 << "=" << a1 / b1 << endl;//两个整数相除,结果依然是整数,将小数部分去除
int a2 = 10;
int b2 = 20;
cout << a2 << "÷" << b2 << "=" << a2 / b2 << endl;
int a3 = 10;
int b3 = 0;
/*cout << a3 << "/" << b3 << "=" << a3 / b3 << endl;*///两个数相除,除数不可以为0
//两个小数可以相除 运算结果也是小数
double a4 = 0.5;
double b4 = 0.25;
cout << a4 << "÷" << b4 << "=" << a4 / b4 << endl;
system("pause");
return 0;
}
输出结果
- 10+3=13
10-3=7
10*3=30
10÷3=3
10÷20=0
0.5÷0.25=2
总结
在除法运算中,除数不能为0
两个整数相除,结果依然是整数,将小数部分去除
两个小数可以相除,运算结果也是小数
eg 2:取模运算
10÷3=3······1 即 10%3=1
int main()
{
//取模运算本质:求余数
int a1 = 10;
int b1 = 3;
cout << a1 << "%" << b1 << "=" << a1 % b1 << endl;
int a2 = 10;
int b2 = 20;
cout << a2 << "%" << b2 << "=" << a2 % b2 << endl;
//两个数相除除数不可以为0,所以也做不了取模运算
int a3 = 10;
int b3 = 0;
/*cout << a3 << "%" << b3 << "=" << a3 % b3 << endl;*/
//报错 两个小数不可以做取模运算
double a4 = 3.14;
double b4 = 1.1;
/*cout << a4 % b4;*/
system("pause");
return 0;
}
输出结果
- 10%3=1
10%20=10
总结
- 取模运算本质:求余数
- 两个数相除除数不可以为0,所以也做不了取模运算
- 两个小数不可以做取模运算
eg 3:递增运算
int main()
{
//1.前置递增
int a = 10;
++a;//让变量+1
cout << "a=" << a << endl;
//2.后置递增
int b = 10;
b++;
cout << "b=" << b << endl;//让变量+1
//3.前置递增和后置递增的区别
//前置递增 先让变量+1,然后进行表达式运算
int a2 = 10;
int b2 = ++a2 * 10;
cout << "a2=" << a2 << endl;
cout << "b2=" << b2 << endl;
//后置递增 先让表达式运算,后让变量+1
int a3 = 10;
int b3 = a3++ * 10;
cout << "a3=" << a3 << endl;
cout << "b3=" << b3 << endl;
system("pause");
return 0;
}
输出结果
- a=11
b=11
a2=11
b2=110
a3=11
b3=100
总结
- 前置递增 先让变量+1,然后进行表达式运算
- 后置递增 先让表达式运算,后让变量+1
3.2 赋值运算符
作用: 用于将表达式的赋值给变量
赋值运算符包括以下几个符号:
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
= | 赋值 | a=2; b=3; | a=2; b=3; |
+= | 加等于 | a=0; a+=2; | a=2; |
-= | 减等于 | a=5; a-=3; | a=2; |
*= | 乘等于 | a=2; a*=2; | a=4; |
/= | 除等于 | a=4; a/=2; | a=2; |
%= | 模等于 | a=3; a%2; | a=1; |
eg:
int main()
{
//=
int a = 10;
cout << "a=" << a << endl;
//+=
a += 2; //a=a+2
cout << "a+=2的结果为" << a << endl;
//-=
a = 10;
a -= 2; //a=a-2
cout << "a-=2的结果为" << a << endl;
//*=
a = 10;
a *= 2; //a=a*2
cout << "a*=2的结果为" << a << endl;
// /=
a = 10;
a /= 2; //a=a/2
cout << "a/=2的结果为" << a << endl;
// %=
a = 10;
a %= 2; //a=a%2
cout << "a%=2的结果为" << a << endl;
system("pause");
return 0;
}
输出结果
- a=10
a+=2的结果为12
a-=2的结果为8
a*=2的结果为20
a/=2的结果为5
a%=2的结果为0
3.3 比较运算符
作用: 用于表达式的比较,并返回一个真值或假值
比较运算符有以下符号:
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
== | 相等于 | 4 == 3 | 0 |
!= | 不等于 | 4 != 3 | 1 |
< | 小于 | 4 < 3 | 0 |
> | 大于 | 4 > 3 | 1 |
<= | 小于等于 | 4 <= 3 | 0 |
>= | 大于等于 | 4 >= 1 | 1 |
eg:
int main()
{
int a = 10;
int b = 20;
// ==
cout << "a == b " << (a == b) << endl;//括号表示先计算a==b,再执行endl,不然报错
// !=
cout << "a != b " << (a != b) << endl;
// >
cout << "a > b " << (a > b) << endl;
// <
cout << "a < b " << (a < b) << endl;
// >=
cout << "a >= b " << (a >= b) << endl;
// <=
cout << "a <= b " << (a <= b) << endl;
system("pause");
return 0;
}
输出结果
- a == b 0
a != b 1
a > b 0
a < b 1
a >= b 0
a <= b 1
3.4 逻辑运算符
作用: 用于根据表达式的值返回真值或假值
逻辑运算符有以下符号
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
! | 非 | !a | 如果a为假,则!a为真; 如果a为真,则!a为假。 |
&& | 与 | a && b | 如果a和b都为真,则结果为真,否则为假。 |
|| | 或 | a || b | 如果a和b有一个为真,则结果为真,二者都为假时,结果为假。 |
eg 1:逻辑非
int main