第2章 C/C++快速入门
2.1 基本数据类型
2.1.1 变量的定义
或
变量名注意点:
①不能是语言标识符;
②第一个字符必须是字母或下划线,除第一个字符之外的其他字符必须是字母、数字或下划线;
③区分大小写。
2.1.2 变量类型
1.整型
(1)整型 int
:绝对值在 1e9
之内可以放心使用。
(2)长整型 long long
:超过 int
时使用,初值太大需要在后面加 LL
。unsigned
可以将负数范围移到正数上。
2.浮点型
(1)单精度 float
:有效精度6-7位。
(2)双精度 double
:有效精度15-16位,因此浮点类型尽量使用 double
。
3.字符型
(1)字符变量和字符常量
使用ASCII码。
(2)转义字符
\n表示换行,\0表示空字符NULL。
(3)字符串常量
C中有字符数组,C++中有string类型。
4.布尔型
C语言使用必须添加 #include <stdbool.h>
头文件。0为false,非0为true,false为0,true为1。
2.1.3 强制类型转换
2.1.4 符号常量和const常量
虽然以上都能定义常量,但是推荐使用 const
写法。
定义注意加括号。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| ### 2.1.5 运算符
#### 1.算术运算符 ++i是先加1在使用i,而i++是先使用i再加1。
#### 2.关系运算符
#### 3.逻辑运算符
#### 4.条件运算符 唯一的三目运算符:( ? : )
#### 5.位运算符 定义无穷大
|
const int INF = (1 << 30) - 1;
const int INF = 0x3fffffff;
1 2 3 4
| ## 2.2 顺序结构
### 2.2.1 赋值表达式
|
int n = 5;
int a, b;
a = b = 5;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| ### 2.2.2 使用scanf和printf输入/输出
#### 1.scanf函数的使用 scanf不要漏写&。
#### 2.printf函数的使用 (1)%md
%md可以使不足m位的int型变量以m位进行右对齐输出,其中高位用空格补齐;如果变量本身超过m位,则保持一样。
(2)%0md
%0md只是在%md中间多加了0。和%md的唯一不同在于,当变量不足m位时,将在前面补足足够数量的0而不是空格。
(3)%.mf
%.mf可以让浮点数保留m位小数输出,这个“保留”使用的是精度的“四舍六入五成双”规则。
### 2.2.3 使用 getchar 和 putchar 输入/输出字符 getchar可以识别换行符。
### 2.2.4 注释 (1)使用“/**/”注释
可以注释若干连续行的内容。
(2)使用“//”注释
注释仅限于行。
### 2.2.5 typedef
可以给复杂的数据类型定义一个别名,提高编码效率。
### 2.2.6 常用math函数
#### 1.fabs(double x) 对double型变量取绝对值。
#### 2.floor(double x)和ceil(double x) 对double变量向下取整和向上取整。
#### 3.pow(double r, double p) 返回 $r^p$。
#### 4.sqrt(double x) 返回double型变量的算术平方根。
#### 5.log(double x) 返回double型变量以自然数为底的对数。若需要其他底数,需用换底公式计算:$log_ab = log_eb / log_ea$。
#### 6.sin(double x)、cos(double x)和tan(double x) 分别返回double型变量的正弦值、余弦值和正切值。
#### 7.asin(double x)、acos(double x)和atan(double x) 分别返回double型变量的反正弦值、反余弦值和反正切值。
#### 8.round(double x) 将double型变量四舍五入。
## 2.3 选择结构
### 2.3.1 if语句 ```cpp if(n == 0) -> if(!n) if(n != 0) -> if(n)
|
2.3.2 if语句的嵌套
1 2 3 4 5 6 7 8 9 10 11
| if(A) { if(B) { ··· } else { ··· } }
|
2.3.3 switch语句
1 2 3 4 5 6
| switch(op) { case 1:···break; ··· default:···break; }
|
2.4 循环结构
2.4.1 while语句
2.4.2 do···while语句
2.4.3 for语句
2.4.4 break和continue语句
break:退出当前循环;
continue:结束循环的当前轮回
2.5 数组
2.5.1 一维数组
数组名[数组大小];```1 2 3 4 5 6 7 8
| 在定义了长度为size的一维数组后,只能访问下标为0~size-1的元素。
### 2.5.2 冒泡排序 冒泡排序的本质在于交换,即每次通过交换的方式把当前剩余元素的最大值移动到一端,而当剩余元素减少为0时,排序结束。
### 2.5.3 二维数组 ```数据类型 数组名[第一维大小][第二维大小];
|
如果数组大小较大(大概$10^6$级别),则需要将其定义在主函数外面,否则会使程序异常退出,原因是函数内部申请的局部变量来自系统栈,允许申请的空间较小;而函数外部申请的全局变量来自静态存储区,允许申请的空间较大。
2.5.4 memset——对数组中每一个元素赋相同的值
memset(数组名, 值, sizeof(数组名));
memset使用的是按字节赋值,速度快,但是只建议赋0或-1,因为二进制补码为全0或全1。二维数组及多维数组的赋值方法也是一样的。
2.5.5 字符数组
1.字符数组的初始化