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

1.悬空else问题

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

#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匹配

#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匹配

#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.&&和||存在的短路问题 

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

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

&&(并且):

if(month >= 3 && month <= 5)

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

if(month == 12 || month==1 || month == 2)

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

3.switch case语句注意事项 

一:书写规范

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

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

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

switch (expression) 
{
 case value1: statement
 case value2: statement
 default: statement
}

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

二:

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

例:

#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语句下执行的内容相同 

#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

#include <stdio.h>
int main()
{
     int i = 1;
 do
 {
     printf("%d ", i);
     i = i + 1;
 }
while(i<=10);

     return 0;
}

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

#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语句

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

#include <stdio.h>
int main()
{
     printf("hehe\n");
     goto next:
     printf("haha\n");

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

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

for(...)
{
 for(...)
 {
 for(...)
 {
 if(disaster)
 goto error;
 }
 }
}
error:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值