7、C++语句

7、C++语句,第1张

目录
  • 一、三种基本的程序结构
    • 1 - if语句
    • 2 - switch语句
    • 3 - if与switch汇编比较
  • 二、枚举
  • 三、结构体与联合体
  • 四、循环
    • 1 - 三种循环实现
    • 2 - 反汇编对比三种循环效率
    • 3 - for循环优化实例

一、三种基本的程序结构

1 - if语句
  • 案例: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的整数倍地址
  • 修改默认编译选项
    • Visual C++:#pragma pack(n)
    • g++:__attribute__(aligned(n))__attribute__(__packed__)
  • 关于数据对齐的建议:尽量将小的数据放在一起,可以节省空间;或者调整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反汇编分析
3 - for循环优化实例
  • 案例:实现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;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1498293.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存