- 一、三种基本的程序结构
- 1 - if语句
- 2 - switch语句
- 3 - if与switch汇编比较
- 二、枚举
- 三、结构体与联合体
- 四、循环
- 1 - 三种循环实现
- 2 - 反汇编对比三种循环效率
- 3 - for循环优化实例
- 案例:if判断是否是闰年
#include
using namespace std;
bool isLeapYear(unsigned int year)
{
// 双分支if
//if ( (year % 400 == 0) || (year%4==0 && year%100 != 0) )
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
{
return true;
}
else
{
return false;
}
}
int main()
{
// 是否是闰年
cout << isLeapYear(2000) << endl;
cout << isLeapYear(2020) << endl;
cout << isLeapYear(2021) << endl;
return 0;
}
2 - switch语句
- switch实现颜色判断
#include
using namespace std;
typedef enum __COLOR
{
RED,
GREEN,
BLUE,
UNKOWN
}COLOR;
int main()
{
// 多分支条件的switch
// switch,case,default
COLOR color1;
color1 = GREEN;
int c1 = 0;
switch (color1)
{
case RED:
{
//cout << "red" << endl;
c1 += 1;
break;
}
case GREEN:
{
//cout << "green" << endl;
c1 += 2;
break;
}
case BLUE:
{
//cout << "blue" << endl;
c1 += 3;
break;
}
default:
{
//cout << "unknown color" << endl;
c1 += 0;
break;
}
}
return 0;
}
3 - if与switch汇编比较
- 使用场景
- ①.switch只支持常量值固定相等的分支判断
- ②.if还可以判断区间范围
- ③.用switch能做的,用if都能做,但反过来则不行
- 性能比较
- ①.分支少时,差别不是很大;分支多时,switch性能较高
- ②.if开始处几个分支效果高,之后效率递减
- ③.switch所有case的速度几乎一样
- if汇编代码
- switch汇编代码
- 枚举的使用细节
- 枚举值不可以做左值
- 非枚举变量不可以复制给枚举变量
- 枚举变量可以赋值给非枚举变量
#include
using namespace std;
int main()
{
enum wT { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; // 声明wT类型
wT weekday; // 定义
weekday = Monday;
weekday = Tuesday;
//weekday = 1; // 不能直接给int值,只能赋值成wT定义好的类型值
cout << weekday << endl;
//Monday = 0; // 类型值不能做左值
int a = Wednesday;
cout << a << endl;
return 0;
}
三、结构体与联合体
- 结构体数据对齐
- 32位CPU
- char:任何地址
- short:偶数地址
- int:4的整数倍地址
- double:8的整数倍地址
- 32位CPU
- 修改默认编译选项
- Visual C++:
#pragma pack(n)
- g++:
__attribute__(aligned(n))
、__attribute__(__packed__)
- Visual C++:
- 关于数据对齐的建议:尽量将小的数据放在一起,可以节省空间;或者调整pragma pack为合适的大小
#include
#pragma pack(1)
using namespace std;
int main()
{
union Score
{
double ds;
char level;
};
struct Student
{
char name[6];
int age;
Score s;
};
cout << sizeof(Score) << endl; // 默认pragma pack时,结果为8
cout << sizeof(Student) << endl; // 默认pragma pack时,结果为24;pragma pack=1时,结果为18
Student s1;
strcpy_s(s1.name, "lili");
s1.age = 16;
s1.s.ds = 95.5;
s1.s.level = 'A';
return 0;
}
四、循环
1 - 三种循环实现
- 循环实现计算1-100的和
#include
using namespace std;
int main()
{ // TODO: 1+2+3+4...+100
// while语句
int sum = 0;
int index = 1;
while (index <= 100)
{
sum += index;
index += 1;
}
//cout << sum << endl;
// for语句
//index = 1;
sum = 0;
for (index = 1; index <= 100; ++index)
{
sum += index;
}
//cout << sum << endl;
// do-while语句
sum = 0;
index = 1;
do
{
sum += index;
index += 1;
} while (index <= 100);
//cout << sum << endl;
return 0;
}
2 - 反汇编对比三种循环效率
- 从底层汇编的生成代码来评估效率:do while循环的效率最高、其次是while循环,最低的是for循环(但是请注意,这个是仅仅从汇编的角度来看,实际还是需要根据具体的业务需求来评估,还需要考虑开发的效率等,比如泛型编程等)
- while反汇编分析:
- for反汇编分析:
- do while反汇编分析
- 案例:实现aabb的完全平方数
#include
using namespace std;
int main()
{
// aabb的完全平方数
int n = 0;
double m = 0;
for (size_t a = 1; a < 10; a++)
{// for1
for (size_t b = 0; b < 10; b++)
{// for 2
n = a * 1100 + b * 11; //aabb
m = sqrt(n);
if (m - int(m) < 0.00000001)
{
cout << n << endl; //7744
}
}// for 2
}// for1
return 0;
}
- 优化方案:实现aabb的完全平方数
#include
using namespace std;
int main()
{
int n = 0;
int high, low;
// aabb的完全平方数
for (size_t index = 31; ; index++)
{
n = index * index;
if (n < 1000)
continue; // 继续下一次循环
if (n > 9999)
break; // 退出循环
high = n / 100; // 4567/100 = 45
low = n % 100; // 4567%100 = 67
if ((high / 10 == high % 10) && (low / 10 == low % 10)) // 判断aa, bb
{
cout << n << endl;
}
}
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)