C++ 入门篇
P5.变量及其作用域
两个重要概念
- 生存期:什么时候分配内存,什么时候释放内存
- 作用域:在什么位置可见,什么位置不可见
全局变量
局部变量:函数内部定义,函数执行时存在
变量赋值
大括号作用域
编程习惯:尽量缩小变量的作用域
P6.常数与常量
-
常数–也叫立即数
- 字符常量
- 整型常数
- 浮点型常数
-
常量–用const修饰的变量,它占用数据区内存,但编译器保证你不能修改它的值
- 多个地方用到同一个常量,内存只有一份拷贝
- 程序中不希望修改的量
-
枚举类型–把一组常数符号化,比如星期,职称等有限种类的情形(enum)
P7.存储修饰符
- auto
- register
- static
- extern
内存的类型–程序分配的内存,主要在栈和堆这两部分。“堆”比“栈”复杂
优美得栈–后进先出得结构
特点:自动分配,自动释放
缺点:栈溢出
P8.基本运算符
四则运算符多数都是既单目又双目,只有一个例外,它是 /
P9.选择与分支
// if语句得条件中可能会发生短路求值现象
int a = 5,b = 8;
int x = 100;
if (a >10 && (x = b)) {
cout << "here" <<endl;
}
cout <<x <<endl
// ?:表达式--是唯一得三目运算符
xxx = a ? b :c;//重点在求值,不在分支
例如
//求三个数最大的那个数
int a=5, b = 2, c = 8;
int m = a;
if (b>m) m = b;
if (c>m) m = c;
cout << m << endl;
P10.switch–当分支情况较多时,选择switch
switch 圆括号中的值必为:整数,字符或者枚举类型
常见bug:
- 忘记了default;
- 忘记了在每个case中写break;
假设修正法
P11.while–循环是程序逻辑的关键点
// 从低位到高位,输出每个十进制数位
int a = 657;
while (true) {
cout << a%10 <<endl;
a /=10;
if (a == 0) break;
}
P12.for循环—已知执行次数
// 打印九九乘法表
for (int j = 1;j <= 9; j++) {
for (int i = 1; i <= j; i++) {
int k = i * j ;
cout << j <<"x" << i << "=" << k << " ";
}
cout << endl;
}
循环变量的生存期大于循环体内的局部变量的生存期
P13.函数入门
// 例如
int mydd (int a, int b){
int t=a*10 + b;
return t;
}
调用方法
int x = mydd(5,8);
函数定义时的参数,称为形参,是局部变量,在栈中分配
调用函数时,传递给它的参数,称为:实参
P14.指针入门–指针就是存放其他变量地址的小盒子
指针的定义
类型 *指针名
// 冒泡排序法
void swap (int* p,int* q)
{
int t = *p;
*p = *q;
*q = t;
}
int mid (int a, int b, int c)
{
if (a>b) swap (&a,&b);
if (b>c) swap (&b,&c);
if (a>b) swap (&a,&b);\
return b;
P15.引用类型
引用是不能运算,只能去引用原来的值
P16.数组入门
任务1:一个整型数组里面,求最大的元素
一般情况下,数组是局部变量
局部变量在栈中分配空间
自动分配,自动释放
怎么知道数组占用多大空间?
// 方法1 元素个数 * 单个元素的大小
#define N 100
...
int a[N];
x = sizeof(int) * N;
// 方法2 sizeof(数组变量名)
#define N 100
...
int a[N];
x = sizeof(a);
2023.9.25更新
P17.函数进阶
使用指针的指针,目的是回填一个指针类型的数据。
P18.数组与指针进阶
指针运算与[]运算的等效性
*(p+n)===p[n]
*p===p[0]
P19.数组元素搬运
数组的拷贝
// 数组的拷贝
void mycopy(int* dst, int* src, const int n)
{
for (int i = 0; i <n ; i++)
{
dst[i] = src[i];
}
}
// 更全面数组拷贝
void mycopy(int* dst, int* src, int* src_end)
{
if (dst == src) return;
int n = src_end - src;
if (dst > src )
for( int i = n-1; i >= 0; i--) dst[i] = src[i];
else
for( int i = 0; i < n; i++) dst[i] = src[i];
}
数组的结构决定了它不适用于频繁地插入和删除,尤其数组很大的时候、
如果需要,可以使用:链表,哈希表,块链等更复杂的结构
P20.插入排序法
2023.9.26更新
P21.二维数组
列优先,存完第一行,存第二行。。。
P22.动态内存分配
内存的分配与释放
- 栈空间的分配与释放是自动进行的,是隐式的
- 堆空间的分配与释放是代码显式操作行为
P23.筛法求素数
普通素数算法
// bool is_prime(int x) 如果x是素数,就返回true
bool is_prime(int x)
{
for (int i = 2; i < x; i++ )
{ if(x%i == 0)
return false;
}
return true;
}
P24.指针数组与数组指针
2023.9.27更新
P25.const修饰符
- 当修饰普通变量的时候
//
const int M = 5;
- 当修饰数组的时候
//
const int a[] = {5} ;//修饰int
int const b[] = {6} ;//同上
- 当修饰指针的时候,就复杂了
//
int x = 5;
const int *p =&x ;//修饰int,元素不能变,保护x
int const *q = &x ;//同上
int * const r = &x ;//修饰的是指针,r将来不能指向别人,但x可以改
P26.break,continue,return
P27.数学运算
c++的标准写法是cmath(注意,没有.h)
查表
随机数
使用相同的种子,总会得到相同的伪随机序列。
P28.表达式的特性
一个表达式必须要返回一个值。
一个表达式也可能会改变变量的值。
P29.按位运算
P30.数据类型转换
2023.10.07更新