11 KiB
C 语言中的if-else语句
原文:https://overiq.com/c-programming-101/if-else-statements-in-c/
最后更新于 2020 年 7 月 27 日
C 语言中的控制语句
到目前为止,在我们编写的所有程序中,语句按照它们出现的顺序依次执行。但是有时我们希望只有在某些条件为真时才执行语句。例如,如果银行余额超过七位数,购买一辆新车,否则续订公共汽车月票。为了做出这样的决定,C 提供了一种称为控制语句的工具。
控制语句用于改变程序的流程。它们用于指定语句的执行顺序。它们通常用于定义控制如何从程序的一部分转移到另一部分。
C 语言有以下控制语句:
- 如果…否则
- 转换
- 环
- 为
- 正在…
- 做...正在…
复合语句
复合语句是使用大括号({})组合在一起的语句块。在复合语句中,所有语句都是按顺序执行的。复合语句也称为块。它采用以下形式:
{
statement1;
statement2;
statement3;
...
statementn;
}
我们了解到所有语句都以分号(;)结尾,但复合语句是这一规则的例外。另一个需要理解的重要事情是,复合语句在语法上等同于单个语句,这意味着我们可以将复合语句放在允许单个语句的地方。这意味着下面的代码完全有效。
#include<stdio.h>
int main()
{
int i = 100;
printf("A single statement\n");
{
// a compound statement
printf("A statement inside compound statement\n");
printf("Another statement inside compound statement\n");
}
// signal to operating system everything works fine
return 0;
}
预期输出:
A single statement
A statement inside compound statement
Another statement inside compound statement
如果语句
If 语句用于测试条件并采取两种可能的操作之一。if 语句的语法是:
语法:
if (condition)
{
// if block
statement1;
statement2;
}
条件可以是任何常量、变量、表达式、关系表达式、逻辑表达式等等。请记住,在 C 中,任何非零值都被认为是真,而0被认为是假。
工作原理:
if 块内的语句(即statement1和statement2)只有在条件为真时才执行。如果为假,则跳过 If 块内部的语句。当条件为真时,当您想要执行多个语句时,大括号({})总是必需的。此外,请注意 if 块中的语句略有缩进。这样做是为了提高可读性,语法上不需要缩进。
如果您想在条件为真时只执行一条语句,那么可以省略大括号({})。通常,即使只有一条语句要执行,也不应该省略大括号。
if (condition)
statement1;
如果用户输入的数字是偶数,下面的程序将打印一条消息。
#include<stdio.h>
int main()
{
int n;
printf("Enter a number: ");
scanf("%d", &n);
if(n % 2 == 0)
{
printf("%d is even", n);
}
// signal to operating system everything works fine
return 0;
}
第一次运行:
运行程序并输入一个偶数,您将获得以下输出:
预期输出:
Enter a number: 46
46 is even
第二次运行:
再次运行程序,但这次输入一个奇数。
预期输出:
Enter a number: 21
这一次,条件(n % 2 == 0)的计算结果为 false,因此 if 块中的语句被跳过。
哪种说法属于 if?
if (condition)
statement1;
statement2;
statement3;
如果条件为假,你能找到哪个语句将被省略吗?
如果 If 语句后面没有大括号({}),那么只有下一个立即语句属于 if 语句。else 和 else-if 子句也是如此(else 和 else-if 子句将在本章后面讨论)。
因此,只有statement1属于 if 语句。因此,如果条件为假,则仅省略statement1。无论条件如何,statement2和statement3将始终被执行。以下示例说明了这一事实:
#include<stdio.h>
int main()
{
if(0)
printf("statement 1\n");
printf("statement 2\n");
printf("statement 3\n");
// signal to operating system everything works fine
return 0;
}
预期输出:
statement 2
statement 3
这里的条件是假的,这就是为什么只执行最后两个语句。这验证了第 6 行中的语句只属于 if 语句的事实。乍看之下,确定哪个语句属于 if 语句有点混乱,这就是为什么建议总是使用大括号({})来包装要用 if 语句执行的语句。
#include<stdio.h>
int main()
{
if(0)
{
printf("statement 1\n");
}
printf("statement 2\n");
printf("statement 3\n");
// signal to operating system prgram ran fine
return 0;
}
现在您可以清楚地看到,只有第一个语句属于 if 语句。
else 子句
else子句允许我们为if条件添加一个替代路径。只有当if条件为假时,才会执行else块下的语句。
语法:
if (condition)
{
// if block
statement1;
statement2;
}
else
{
// else block
statement3;
statement4;
}
通常,如果 else 块中只有一条语句,那么大括号({})可以省略。虽然,不推荐。
if (expression)
statement1;
else
statement2;
如前所述,缩进不是必需的,因此上面的代码也可以写成:
if (expression)
statement1;
else
statement2;
但是为什么要抹杀可读性呢?做一个好的程序员,总是缩进我们的代码。
现在,让我们在之前编写的程序中添加一个else子句。
#include<stdio.h>
int main()
{
int n;
printf("Enter a number: ");
scanf("%d", &n);
if(n % 2 == 0)
{
printf("%d is even", n);
}
else
{
printf("%d is odd", n);
}
// signal to operating system everything program ran fine
return 0;
}
**第一次运行:**运行程序并输入一个偶数。
Enter a number: 44
44 is even
第二次运行:
再次运行程序,但这次输入一个奇数。
Enter a number: 91
91 is odd
再考虑一个例子。以下程序确定两个输入数字中较大的一个:
#include<stdio.h>
int main()
{
int a, b;
printf("Enter two numbers: ");
scanf("%d %d", &a, &b);
if(a > b)
{
printf("%d is greater than %d", a, b);
}
else
{
printf("%d is greater than %d", b, a);
}
// signal to operating system everything works fine
return 0;
}
预期输出:
第一次运行:
Enter two numbers: 344 200
344 is greater than 200
第二次运行:
Enter two numbers: 99 999
999 is greater than 99
嵌套 if… else
我们可以添加if..else声明在if街区或else街区内。这叫做【T4 的筑巢】..else。语法:
if(condition1)
{
if(condition2)
{
statement1;
statement2;
}
else
{
statement3;
statement4;
}
}
else
{
if(condition3)
{
statement5;
statement6;
}
else
{
statement7;
statement8;
}
}
我们可以筑巢if..else陈述到任何深度。
工作原理:
首先检查condition1,如果为真,则检查condition2,如果为真,则执行if块内的语句(第 4-7 行)。
否则,执行else块(第 10-13 行)中的语句。否则,如果condition1为假,则检查condition3,如果为真,则执行第 19-22 行 if 块下的语句。否则,执行else块(第 25-28 行)中的语句。
以下程序使用两个嵌套的 if-else 语句来确定三个数字中较大的一个:
#include<stdio.h>
int main()
{
int a, b, c, larger;
printf("Enter three numbers: ");
scanf("%d %d %d", &a, &b, &c);
if(a > b)
{
if(a > c)
{
larger = a;
}
else
{
larger = c;
}
}
else
{
if(b > c)
{
larger = b;
}
else
{
larger = c;
}
}
printf("Largest number is %d", larger);
// signal to operating system everything works fine
return 0;
}
预期输出:
第一次运行:
Enter three numbers: 12 35 54
Largest number is 54
第二次运行:
Enter three numbers: 77 23 871
Largest number is 871
匹配 if..其他部分
有时将 else 子句与if语句联系起来会变得令人困惑。考虑以下示例:
if(a<10)
if (a % 2 ==0)
printf("a is even and less than 10\n");
else
printf("a is greater than 10");
哪个if语句与else块相关联?根据代码缩进的方式,您可能会认为else属于第一个if语句,但事实并非如此。编译器不会根据缩进将if和else语句关联起来,而是将 else 部分与最接近的不匹配的if部分进行匹配。所以else语句与第二个if语句相关联。
使用牙套({})我们总能避免这样的并发症。
if(a < 10)
{
if (a % 2 ==0)
{
printf("a is even and less than 10\n");
}
else
{
printf("a is greater than 10");
}
}
现在一切都清楚了。
else if 子句
if-else是一个双向语句,用于测试一个条件并采取两个可能的动作之一。如果我们要进行一系列测试呢?检查多个条件的一种方法是使用嵌套的if-else语句。我们在本章前面已经看到了这种技术的一个例子。实现这一点的另一种方法是使用 else-if 子句。else-if 子句扩展了基本的 if-else 语句,并允许我们执行一系列测试。if-else 语句的更新语法如下所示:
if(condition1)
{
statement1;
}
else if(condition2)
{
statement2;
}
else if(condition3)
{
statement3;
}
...
else
{
statement4;
}
这里,逐一检查每个条件。一旦发现一个条件为真,则执行对应于该块的语句。if-else 语句的其余部分中的条件和语句被跳过,程序控制从if-else语句中出来。如果所有条件都不成立,则执行else块中的语句。
使用else-if子句,我们可以以更紧凑的形式编写嵌套的if-else语句。
让我们重写程序,使用 else-if 子句来确定这两个数字中最大的一个。
#include<stdio.h>
int main()
{
int a, b, c, larger;
printf("Enter three numbers: ");
scanf("%d %d %d", &a, &b, &c);
if(a > b && a > c)
{
larger = a;
}
else if(b > a && b > c)
{
larger = b;
}
else
{
larger = c;
}
printf("Largest number is %d", larger);
// signal to operating system everything works fine
return 0;
}
这个版本的程序在功能上等同于使用嵌套 if-else 语句的程序。但它避免了深缩进,使代码更易读。