前言
if语句是在学习C语言中过程中遇到的第一个非常重要的语句,在使用过程中往往会出现各种问题,所以在此总结出一些最常见的问题供大家参考和讨论。
1. if语句控制的范围问题
在大多数编程语言中,if语句默认只能控制其接下来的第一条语句,如果想要控制多条语句,则必须将被包含的语句用花括号括起来。
#include <stdio.h>
int main()
{
if (3 > 2)
printf("AAAA\n"); // AAAA会输出
printf("BBBB\n"); // BBBB也会输出,但是不受if语句的控制
if (1 > 2)
printf("CCCC\n"); // CCCC不会输出
printf("DDDD\n"); // DDDD依旧会输出,因为if语句默认只能控制接下来的第一条语句,通俗地说,BBBB的输出与if语句无关
return 0;
}
2. 空语句问题
初学时容易在if ()
后加分号,如if ();
。C语言规定,见到分号就是一个完整的语句。因为if默认只能控制其接下来的第一条语句,所以空语句后的所有语句都与if语句无关。
#include <stdio.h>
int main()
{
if (1 > 2);
printf("AAAA\n");
printf("BBBB\n");
// 等价于
if (1 > 2)
; // 这样的语句被称为空语句
printf("AAAA\n"); // AAAA会输出,因为该语句与if语句无关
printf("BBBB\n"); // BBBB也会输出,因为该语句与if语句无关
return 0;
}
3. 在if…else if…else…语句中间插入多条语句的问题
#include <stdio.h>
int main()
{
if (3 > 2)
printf("AAAA\n");
else if (3 == 2)
printf("BBBB\n");
printf("CCCC\n");
else
printf("DDDD\n");
return 0;
}
如上代码会使程序出错,因为if语句默认只能控制其接下来的第一条语句,同理,else if和else语句也默认只能控制其接下来的第一条语句。当使用if…else if…else…语句时,如果在中间插入多条语句,则需要用花括号括起来。正确代码如下所示:
#include <stdio.h>
int main()
{
if (3 > 2)
printf("AAAA\n");
else if (3 == 2)
{
printf("BBBB\n");
printf("CCCC\n");
}
else
printf("DDDD\n");
return 0;
}
- 思考:如果在上面程序中的
if (3 > 2)
后加一个分号,此时的程序(也就是下面的程序)是否可以编译运行?
#include <stdio.h>
int main()
{
if (3 > 2);
printf("AAAA\n");
else
printf("BBBB\n");
return 0;
}
4. if…else if…else…语句执行的个数问题
#include <stdio.h>
int main()
{
if (3 > 2)
printf("AAAA\n");
else if (3 > 1)
printf("BBBB\n");
else
printf("CCCC\n");
return 0;
}
- 推断1:如果AAAA和BBBB都输出,则只要当if…else if…else…语句中的表达式成立,就会执行所有成立的表达式对应的语句
- 推断2:如果只有AAAA输出而BBBB不输出,则当if…else if…else…语句中即便有多个表达式同时成立也只会从上至下执行第一个成立的表达式对应语句
- 运行结果:只有AAAA输出,推断2成立
5. 可否仅使用if…else if…语句而不使用else语句
#include <stdio.h>
int main()
{
if (3 > 2)
printf("AAAA\n");
else if (3 > 1)
printf("BBBB\n");
return 0;
}
答案是可以的,通过程序可以验证,语法上没有任何的错误,但是逻辑上可能会出现一定的漏洞。
6.else后是否可以加表达式
#include <stdio.h>
int main()
{
if (3 > 2)
printf("AAAA\n");
else if (3 > 1)
printf("BBBB\n");
else (5 > 3)
printf("CCCC\n");
return 0;
}
如上代码无法编译成功,证明else后不可以加表达式。
- 思考:如果在上面程序中的else后加一个分号,此时的程序(也就是下面的程序)是否可以编译运行?
#include <stdio.h>
int main()
{
if (3 > 2)
printf("AAAA\n");
else if (3 > 1)
printf("BBBB\n");
else (5 > 3);
printf("CCCC\n");
return 0;
}
上图中的代码是可以编译并运行的,原因如下面的代码所示:
else (5 > 3);
printf("CCCC\n");
//等价于
else
(5 > 3);
printf("CCCC\n");