C++三种基本结构

C++语言有三种基本结构:
在这里插入图片描述

分支结构

if分支

if语句是最常用的一种分支语句,也称为条件语句。

if(p != NULL)
{

}
else
{

}

写else的时候一定要注意不要有模糊的内容,放置出现bug。

if的示例1:实现一个函数:输入一个年号,判断是否是闰年

//1、能否被400整除
//2、能否被4整除但是不能被100整除
if((year%4 == 0 && year%100 != 0) || year % 400 == 0)
{
	return true;
}
else
{
	return false; 
}

//这里有个小技巧,if中的语句这样写效率会高一点。
//第一个括号中先判断年份是否能被4整除,不能的话就不会往下判断
//考虑命中率的问题,大部分年份被4整除的概率更高,被400整除的概率较低,所以把命中率高的判断条件放在前面

if判断示例2:判断b是否是a的倍数

if((a != 0) && b%a == 0)
{
	return true;
}
else
{
	return false;
}
//这里也要注意,判断条件一定要先判断a!=0,当a==0时剩下的判断不会再次进行,否则程序报错

以上两个实例可以说明,在if判断条件中可以使用&&来提高效率,也要注意判断条件的顺序。

switch分支

switch适用于多个分支的情况:

enum color
{
	RED,
	GREEN,
	BLUE
};

color color1 = GREEN;

switch(color1)
{
	case RED:
	{
		cout<<"red"<<endl;
		break;
	}
	case GREEN:
	{
		cout<<"green"<<endl;
		break;
	}
	case BLUE:
	{
		cout<<"blue"<<endl;
		break;
	}
	default:
	{
		cout<<"unknown"<<endl;
		break;
	}
}

switch分支中有break,一旦发现有需要执行的语句,执行完后直接跳出。如果不加break,剩下的语句会继续执行下去不会停止。

switch判断条件中是个表达式,表达式的值必须是常数值,不能是其他内容。

if和switch的区别

我们从底层来区分这两者的区别。

从汇编层面上说,if判断是个层层递进的结构,是个枝杈结构,满足的话就执行,不满足就跳转到下一个枝杈,是个树形结构。而switch进入循环直接判断,一旦满足才会跳转,不满足就继续比较,类似于一个表。

在分支不是很多的情况中,if和switch相差不大,但是一旦分支非常多,那么从汇编结构来看,switch效率就明显提高。因为if是树形结构,需要层层递进执行,开始时效果高,之后效果递减。switch所有的case速度几乎是一样的。

if也有自己的优势,switch只能支持常量值固定相等的分支判断。if还支持判断区间范围。即if能做的事情比switch更多。

循环结构

三种循环语句

总共有三种循环语句:while、do while和for

while(表达式)
{
循环体
}

do
{
循环体
}while(表达式);

for(表达式1;表达式2;表达式3)
{
循环体
}

我们可以从底层汇编观察这三种循环。其中do while循环效率最高,其次是while循环,最低是for循环。但是实际开发中for循环用的更多,它更加人性化,而且在面向对象编程中有优势。

多层循环

例子:输出所有形如aabb的四位完全平方数(n²)

//思路1:a:1~9;b:1~9,枚举aabb,判断是不是完全平方数
const static int length = 10;

int n = 0;
double m = 0;
for(size_t a=0;a<length;a++)
{
	for(size_t b = 0;b<length;b++)
	{
		n = a*1100 + b*11;  //aabb
		m = sqrt(n);   //开平方
		if((m - int(m)) < 0.00000001//判断开平方后是不是整数
		{
			cout<<n<<endl;
		}
	}
}
//思路2:逆向操作,先保证n是完全平方数,然后再判断是否是aabb。这样避免因为判断平方根的时候丢失精度而且只需要单层循环
//而且求平方根的操作在计算机中是很慢的,以后要尽量避免平方根
for(size_t index = 1;;index++)  //因为31*31=961,32*32=1024,index可以从32开始
{
	n = index*index;
	if(n<1000)			
	{
		continue;		//退出本次循环,继续下一次循环
	}
	if(n>9999)
	{
		break;			//直接跳出循环
	}	
	high = n/100;		//取高位的2位
	low = n%100;		//取低位的2位
	
	if((high/10 == high%10) && (low/10 == low%10))
		cout<<n<<endl;
}
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值