首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >分支和循环中容易忽略的点

分支和循环中容易忽略的点

作者头像
趙卋傑
发布2026-01-12 14:43:57
发布2026-01-12 14:43:57
810
举报

1.悬空else问题

如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。

代码语言:javascript
复制
#include <stdio.h>
int main()
{
     int a = 0;
     int b = 2;
     if(a == 1)
         if(b == 2)
             printf("hehe\n");
     else
         printf("haha\n");
     return 0;
}

答案是什么也不输出。

原因: 这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近 的 if 匹配,此处else语句是和第二个else语句对齐的,第⼀个 if 语句就不成⽴,嵌套 if 和 else 就没机会执⾏了,最终啥都不打印。

 所以在我们使用if语句时,会用{}来限制作用域

改正1:此时else和第二个if匹配

代码语言:javascript
复制
#include <stdio.h>
int main()
{
     int a = 0;
     int b = 2;
     if(a == 1)
     {
         if(b == 2)
             printf("hehe\n");
         else
             printf("haha\n");
     }
    return 0;
}

改正2:此处else与第一个if匹配

代码语言:javascript
复制
#include <stdio.h>
int main()
{
     int a = 0;
     int b = 2;
     if(a == 1)
 {
     if(b == 2)
         printf("hehe\n");
 }
 else
 {
     printf("haha\n");
 }
    return 0;
}

2.&&和||存在的短路问题 

在我们使用这两个操作符时它的运算顺序总是先对左侧的表达式求值,再对右边的表达式求值,

如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”

&&(并且):

代码语言:javascript
复制
if(month >= 3 && month <= 5)

表达式中&& 的左操作数是 month >= 3 ,右操作数是 month = 3 的 结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0。 所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏。   ||(或者):

代码语言:javascript
复制
if(month == 12 || month==1 || month == 2)

如果month == 12,则不⽤再判断month是否等于1或者2,整个表达式的结果也是1(是冬季)。 所以, || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。

3.switch case语句注意事项 

一:书写规范

switch 后的 expression 必须是整型表达式

case 后的值,必须是整形常量表达式

case 和后边的数字之间必须有空格

代码语言:javascript
复制
switch (expression) 
{
 case value1: statement
 case value2: statement
 default: statement
}

上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值, 就执⾏ default 分⽀;default可放在任意位置,但我们一般认为先执行完case语句再执行default语句,所以我们常常把该语句放在最后。

二:

switch 语句常常和break一块使用,因为switch语句仅仅是一个分支语句,并没有像if语句那样的判断条件,所以break在这里起到了跳出当前语句块的作用。

例:

代码语言:javascript
复制
#include <stdio.h>
int main()
{
     int n = 0;
     scanf("%d", &n);
     switch(n%3)
     {
     case 0:
         printf("整除,余数为0\n");
         break;
     case 1:
         printf("余数是1\n");
         break;
     case 2:
         printf("余数是2\n");
         break;
 }
     return 0;
}

三:

多个case语句下执行的内容相同 

代码语言:javascript
复制
#include <stdio.h>
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;
 }
 return 0;

}

4.do while循环注意事项

该语句至少执行一次,即do语句块必须执行一次

while后面必须有分号

例1:输出1—-10

代码语言:javascript
复制
#include <stdio.h>
int main()
{
     int i = 1;
 do
 {
     printf("%d ", i);
     i = i + 1;
 }
while(i<=10);

     return 0;
}

例2: 判断一个数是几位数

代码语言:javascript
复制
#include <stdio.h>
int main()
{
     int n = 0;
     scanf("%d", &n);
     int cnt = 0;
 do
 {
     cnt++;
     n = n / 10;
 } 
while (n);
 printf("%d\n", cnt);
 return 0;
}

这个代码就⽐较适合使⽤ do while 循环,因为n即使是 0,也是1位数,要统计位数的。

5.break和continue

这两个语句只能在循环中使用

break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执 ⾏。

continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所 差异的(在while循环中使用该语句容易造成死循环)。 

6.goto语句

可以实现在同一个函数内跳转到设置好的标号处

代码语言:javascript
复制
#include <stdio.h>
int main()
{
     printf("hehe\n");
     goto next:
     printf("haha\n");

next:
     printf("跳过了haha的打印\n");
     return 0;
}

goto语句在多层嵌套循环中可以快速跳出循环 

代码语言:javascript
复制
for(...)
{
 for(...)
 {
 for(...)
 {
 if(disaster)
 goto error;
 }
 }
}
error:
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.悬空else问题
  • 2.&&和||存在的短路问题 
  • 3.switch case语句注意事项 
  • 4.do while循环注意事项
  • 5.break和continue
  • 6.goto语句
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档