geekdoc-python-zh/docs/overiq/025.md

11 KiB
Raw Permalink Blame History

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 块内的语句(即statement1statement2)只有在条件为真时才执行。如果为假,则跳过 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。无论条件如何,statement2statement3将始终被执行。以下示例说明了这一事实:

#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语句,但事实并非如此。编译器不会根据缩进将ifelse语句关联起来,而是将 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 语句的程序。但它避免了深缩进,使代码更易读。