1.else if 分支循环
应用举例:
int main()
{
int age = 0;
scanf("%d", &age);
if (10 < age && age < 20)
printf("青年");
else if (age >= 20 && age < 30)
printf("少年");
else
{
printf("其他人");
}
return 0;
}
有几点需要注意
1.本质上
else if(条件)
{
执行语句
}
这个语句是这样的
else
{
if(条件)
执行的语句
}
前者是简略写法。
2.很多同学在初学的时候(比如我)又犯一些书写错误
第一种
else if (age >= 20 && age < 30)
写成
else if (20<= age < 30)
这样写是错误的。
写成这样实际会如何判断呢!
比如我输入15时,此时会先执行 20<= age ,此时语句为假,则值为0,而0 小于30,语句成立,执行else if后面的执行语句。
第二种
if (10 < age && age < 20)
printf("青年");
printf("好好学习");
if 或者else或者if else 后面跟两条语句,且没有用大括号括起来。这样也是不成立的,这样实际上被if判断的执行语句实际只有前一句。无论是if 还是for 等分支循环语句后面默认只会跟一条语句,超出一条语句就要用括号。
这也是为什么if后面千万不能加“;”,“;’”本身就是一句空语句,这样的话,if控制的就是一条空语句。
3.悬空else的问题
int main()
{
int a = 0;
int b = 1;
if (a == 1)
if (b == 1)
printf("呵呵\n");
else
printf("哈哈\n");
return 0;
上面这段代码很多同学可能会认为输出的是哈哈,但实际是什么都不会输出,因为这里的else一定是和第二个if配对的(不要看它和第一个if齐平),实际在用vs2019时,系统会自动改成和第二个if对齐
int main()
{
int a = 0;
int b = 1;
if (a == 1)
if (b == 1)
printf("呵呵\n");
else
printf("哈哈\n");
return 0;
}
a= 0是不符合第一个if的判断语句的,所以根本不会执行if 也不会执行后面的else(这里要注意,这里if else没有用大括号括起来,但是还是默认全部是第一个if的子语句,因为系统默认if else是一条语句而不是两条语句,因为if和else每次只会有一个执行,永远不会同时执行。)
else一定是和理他最近的if匹配的
如果我就要else和第一个if匹配怎么办呢
可以使用大括号
int main()
{
int a = 0;
int b = 1;
if (a == 1)
{
if (b == 1)
printf("呵呵\n");
}
else
printf("哈哈\n");
return 0;
}
``
4.if语句的书写形式的相关问题
第一
```c
int test()
{
int a = 2;
if (a)
{
return 1;
}
return 0;
}
int main()
{
int ret = test();
printf("ret = %d\n", ret);
return 0;
}
看上述代码,我们知道实际上test()函数的作用,就是a为真返回1,否则返回0。与下面的代码是如出一辙的
int test()
{
int a = 2;
if (a)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int ret = test();
printf("ret = %d\n", ret);
return 0;
但是前者非常容易引起歧义,所以前者是不好的书写风格,而后者才是可取的。
第二
int main()
{
int num = 1;
if (num == 5)
printf("hh\n");
return 0;
}
上述代码本身没有问题,但是当有人误触将==写成了=时,不难发现,此时系统不会报错,甚至还有有结果。这样就不好。所以在判断一个变量等于一个常量时,往往会将常量写在变量的前面,如下面的代码一样
int main()
{
int num = 1;
if ( 5 == num)
printf("hh\n");
return 0;
}
这样的话,即使写成5=num系统会自动报错(相当于给常量赋值),这样就避免了这样的情况。