分支、循环
枚举
typedef enum __color{
RED,
GREEN,
UNDEFINED
} color;
里面的值默认从0开始
分支
if /else
if () {
}else if (){
}
switch
若不加break,后续所有case都会执行
color c1;
c1 = RED;
switch (c1) {
case RED:
cout << RED << endl;
break;
case GREEN:
cout << GREEN << endl;
case UNDEFINED:
cout << UNDEFINED <<endl;
default:
cout << "cnm" << endl;
}
使用场景
- switch 只支持常量值固定相等的分支判断;
- if还可以判断区间范围
性能分析
- if的汇编中,类似于一棵树,层层向下寻找合适的匹配,查找就会做跳转
- switch的汇编,会在开始形成一个类似表格的数据,一个一个去匹配,合适的再做跳转
- 分支多时,switch性能更好
- switch所有case的速度几乎一样
- if开始几个分支的效率高,后续递减
结构体内存布局
#include <iostream>
using namespace std;
// 设置内存为连续分配
#pragma pack(1)
int main() {
// 内存布局
// 联合体 union
union Score {
double sc;
char level;
};
// 结构体
//
struct Student{
char name[6];
int age;
Score s;
};
Score sc;
Student s;
strcpy(s.name,"name");
cout << sizeof (sc) << endl; // 8
cout << sizeof(s) << endl; // 24
return 0; // text 代码区
}
32位cpu,4字节为一个单位存储 char : 任何地址 short : 偶数地址 int : 4的整数倍地址 double : 8的整数倍地址。
当没有设置内存编译选项的时候,结构体内存会以最大变量的范围为单位,去进行扩充。
比如:上述Student的内存,Score的大小为8,所以,虽然name的大小为6字节, age 的大小为4字节,但是它们都会扩充为8的倍数大小,而后,name分配8字节空间,占据6字节, age分配8字节空间,占据4字节。所以整个大小为24字节
有无办法让它们连续分配?
- Visual C++ : # pragma pack(n)
- g ++ : attribute(aligned(n)) 、attribute(packed)
函数重载
#include <iostream>
#include "math.h"
using namespace std;
int test(int a){
return a;
}
int test(double a){
return a;
}
// 默认值参数,在有默认值的参数之后的参数,必须有默认值
int test(int a=10,double b = 10){
return a + b;
}
int main() {
// 直接调用报错 编译器不知道是哪一个方法
// int result = test(1);
// 改为用指针 代表一个参数为int的函数
int (*p)(int);
p = test;
int result = (*p)(1);
cout << result << endl;
return 0; // text 代码区
}
指向函数的指针与返回指针的函数
指向函数的指针:
每一个函数都占用一段内存单元,它们有一个起始地址,指向函数入口地址的指针称为函数指针。
一般形式:数据类型 (指针变量名)(参数表); 例子:int(p)(int); 这里的数据类型是指向函数的返回类型
返回指针的函数:
int* p(int); // 是函数,返回的值是一个指针
#include <iostream>
#include "math.h"
using namespace std;
int MaxValue(int a, int b){
return (a > b) ? a:b;
}
int MinValue(int a, int b){
return (a < b) ? a:b;
}
// 回调函数
bool ProcessNum(int a,int b,int(*p)(int a,int b)){
cout << p(a,b) <<endl;
return true;
}
int main() {
int a = 10, y =20;
ProcessNum(10,20,MaxValue); // 20
ProcessNum(10,20,MinValue); // 10
return 0; // text 代码区
}