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;
}