目录
分支
一、分支语句结构
1. if 单分支
2. if-else 双分支
3. if-else if- else 多分支
4.switch-case 开关选择
二、注意事项
1. 悬空else
2. =与==误用
3.switch-case语句忘加break
4.switch() 的()中必须为整形表达式, case 后面必须是整形常量表达式
循环
一、循环语句结构
1. while 循环
2. for 循环
3. do-while循环
二、跳出循环语句
1.break
2.continue
3.goto
三、注意事项
1.不要在for循环内部修改循环变量,可能会导致for循环失控
2.建议for循环的循环控制变量采取前闭后开区间写法
3.for循环变种
分支
一、分支语句结构
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
printf("未成年\n");
return 0;
}
int main()
{
int age = 0;
scanf("%d", &age);
//if 和 else 后面只根一条语句的时候可以不用{}
if (age < 18)
printf("未成年\n");
else
printf("成年\n");
}
int main()
{
int age = 0;
scanf("%d", &age);
if (age < 18)
{
printf("未成年\n");
}
else if (age >= 18 && age < 30)
{
printf("青年\n");
}
else if(age >= 30 && age < 60)
{
printf("中年\n");
}
else if (age >= 60 && age < 90)
{
printf("老年\n");
}
else
{
printf("老寿星\n");
}
}
如果选择太多,用if-else就太繁琐了
switch-case语句基本格式:
案例1:输入1,打印星期一;输入2,打印星期二;··················输入7,打印星期日
int main()
{
int day = 1;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期日\n");
break;
default:
printf("选择错误\n");
break;
}
return 0;
}
根据实际需要,多个case是可以合并的
案例2: 输入1,2,3,4,5,输出工作日;输入6,7输出星期日
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("选择错误\n");
break;
}
return 0;
}
二、注意事项
下面代码输出结果是啥?
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
结果是什么都不打印!!! 我们会下意识认为对齐的if else匹配从而误认为这段代码输出haha, 事实上if-else 匹配规则是 : else与离他最近的未匹配的if进行匹配
我们自己在写代码时,也应该避免这种写法, 当if-else语句较多时,哪怕后面只跟一条语句,也加上{},这样就很清楚了~
if语句或者else if语句后面经常出现判断相等, 相等是 == ,容易与=混淆,从而导致逻辑错误
int main()
{
int a = 0;
if (a = 1)
printf("hehe\n"); //hehe
return 0;
}
本来a和1不相等,应该什么都不打印,但是由于写成了把1赋值给a,导致if条件为真,打印hehe
因此建议数值与变量判断相等时,把数字写==左边,变量写==右边,如果不小心写成=的话会报错,因为不能将变量赋值给常量
int main()
{
int a = 0;
if (1 == a)
printf("hehe\n");
return 0;
}
如果每个case后面没有break,那么语句会从进入的case开关一路往下执行,可能会导致逻辑错误
例如输入5,会输出星期五、星期六、星期日
int main()
{
int day = 1;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
case 2:
printf("星期二\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
case 5:
printf("星期五\n");
case 6:
printf("星期六\n");
case 7:
printf("星期日\n");
default:
printf("选择错误\n");
break;
}
return 0;
}
int main()
{
int day = 0;
int i = 0;
switch (day)
{
case 1.0: //(×)
//
case '2': //(√) 字符在内存中存储的是ASCII值,也属于整形家族
//
case i: //(×)
//
}
return 0;
}
循环三要素: 循环变量初值,循环条件判断,循环变量更新
一、循环语句结构
while() ()内部填循环条件,{}内是循环体
int main()
{
//屏幕上打印1~10
int i = 1;
while(i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
for循环相比于while循环就是把循环三要素放在一起了,显得更加紧凑
int main()
{
//for循环打印1~10
int i = 0;
for (i = 1;i <= 10;i++)
{
printf("%d ", i);
}
return 0;
}
while循环和for循环的特点是循环条件的判断次数总是比循环体的执行次数多一次, 而do-while循环的特点是循环体的执行次数和循环条件的判断次数是一样的,因为刚上来就会先执行循环体
int main()
{
//打印1~10
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
break用于跳出当前整个循环,在三种循环结构中,他们是一样的效果
while循环:
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break; //break用于永久终止整个循环
printf("%d ", i); //1 2 3 4
i++;
}
return 0;
}
for循环
int main()
{
//while循环和for循环中, break功能是一样的
int i = 0;
for (i = 1;i < 10;i++)
{
if (i == 5)
{
break;
}
printf("%d ", i); //1 2 3 4
}
return 0;
}
do-while循环
int main()
{
//打印1~10
int i = 1;
do
{
if (i == 5)
break;
printf("%d ", i);// 1 2 3 4
i++;
} while (i <= 10);
return 0;
}
continue用于跳出本次循环,进入下次循环
注意区分在不同循环结构中,continue起到的作用的差异
while循环
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue; //continue用于跳过本次循环,直接进入下次循环
printf("%d ", i); //1 2 3 4 死循环
i++;
}
return 0;
}
由于continue跳过后面的代码,因此再也没有机会执行i++了,因此死循环
for循环
int main()
{
int i = 0;
for (i = 1;i < 10;i++)
{
if (i == 5)
{
continue;
}
printf("%d ", i); //1 2 3 4 6 7 8 9
}
return 0;
}
for循环的循环变量的更新在for()括号里面,因此conytinue跳过本次循环, i会更新,进入下次循环
do-while循环
int main()
{
//打印1~10
int i = 1;
do
{
if (i == 5)
continue;
printf("%d ", i); //1 2 3 4 死循环
i++;
} while (i <= 10);
return 0;
}
有时for循环可能嵌套了很多,而break只能跳出当前for循环,因此每个for循环都需要一个break才能调到最外面, 而goto语句可以跳转到任意一个位置
举个简单栗子
int main()
{
again:
printf("hehe\n");
printf("haha\n");
printf("heihei\n");
goto again;
return 0;
}
代码运行结果是会死循环打印这三条语句
以下代码导致死循环
int main()
{
int i = 0;
for (i = 1;i <= 100;i++)
{
//业务处理
i = 0;
}
return 0;
}
int main()
{
int i = 0; //[0, 10)
//for (i = 0;i <= 9;i++) 不建议这样写
for (i = 0;i < 10;i++) //10是有意义的,打印10个数
{
i = 0;
}
return 0;
}
①省略for循环三要素的某一个或多个
1)不要省略条件判断,省略了意味条件恒为真,会导致死循环
int main()
{
for (;;)
{
printf("hehe\n");
}
return 0;
}
2)省略其他部分可能会导致结果错误
本意是打印9个hehe, 但结果只打印了3个hehe(因为外面for进入第二次循环时,j没有归0,内层for不再执行,第三次也一样)
int main()
{
int i = 0;
int j = 0;
for (i = 0;i < 3;i++)
{
for (j = 0;j < 3;j++)
{
printf("hehe\n");
}
}
return 0;
}
②多个循环变量构成的循环控制语句
int main()
{
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
{
printf("hehe\n"); //打印两个hehe
}
return 0;
}