C语言中的逻辑与循环

163 阅读2分钟

逻辑表达式

C语言用逻辑运算对数据间的逻辑关系进行运算,本质上是二进制数据的比较

逻辑运算的结果是整数,非0即为真

对于单个变量的逻辑运算

运算符含义
大于
<小于
==等于
>=大于等于
<=小于等于
!=不等于

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rTmAgL8L-1683022472409)(foruda.gitee.com/images/1677… “1675324410875.png”)]

/*
    single_logical_operation.c
    单一变量的逻辑运算
    BeginnerC
*/
#include <stdio.h>
int main()
{
    int result = 0;
    int number_1, number_2;
    scanf("%d %d", &number_1, &number_2);
    printf("%d > %d = %d\n", number_1, number_2, result = number_1 > number_2);
    printf("%d >= %d = %d\n", number_1, number_2, result = number_1 >= number_2);
    printf("%d < %d = %d\n", number_1, number_2, result = number_1 < number_2);
    printf("%d <= %d = %d\n", number_1, number_2, result = number_1 <= number_2);
    printf("%d == %d = %d\n", number_1, number_2, result = number_1 == number_2);
    printf("%d != %d = %d\n", number_1, number_2, result = number_1 != number_2);
    return 0;
}

上面的案例集中展现了六种基本逻辑运算,我们可以将他们作为一个有用的参考。

对于一个逻辑关系组的逻辑运算

有的时候,情况会更加复杂一点,这就需要我们引入 “与或非" 的概念进行拓展。

符号含义
&&
!

他们可以帮助我们进行更为复杂的逻辑判断,方法就是将各个基本的逻辑运算组合到一起。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4BvCWQ1A-1683022472410)(foruda.gitee.com/images/1677… “1675324747354.png”)]

/*
    group_logical_operation.c
    对于一组变量的逻辑运算
    BeginnerC
*/
#include <stdio.h>
int main()
{
    printf("%d\n", !(1 != 3));
    printf("%d\n", (1 != 3) && (2 == 2));
    return 0;
}

这个程序以展现了非运算与与运算的使用,我们可以发现,非运算会将逻辑运算的结果取反,而与运算需要所有条件为真时才可以为真。

(或运算不一样,它只需要参与运算的关系组中的其中一个为真就可以)

if 语句

if 语句依托于逻辑运算,它的基本形式如下。

if (condition)
{
	stataments;
}

其中,condition 是一个逻辑表达式,if 会根据运算的结果决定是否执行语句块中的语句。

/*
    if.c
    初步使用 if 语句
    BeginnerC
*/
#include <stdio.h>
int main()
{
    int number;
    scanf("%d", &number);
    if (number >= 0)
        puts(">= 0");
    else
        puts("< 0");
    return 0;
}

这个案例很好地揭示了 if 语句的基本使用,唯一需要补充的地方就是,我们省略了 {},这就使得我们的语句块只能使用一条语句。

循环语句

循环语句是 if 语句与跳转语句的结合,它的运作逻辑也非常简单。

循环语句会先执行逻辑关系式,并根据逻辑关系式中的结果决定是否执行语句块,与 if 语句不同的是,循环语句在语句块执行完成之后,会继续返回到逻辑关系式处进行判断。

循环语句可以用 if 语句实现,不过这需要 goto 语句的帮助。

goto 语句

goto 语句被称为无条件跳转语句,它能够迅速改变代码的执行位置(在同一函数中)。

goto 语句依靠两个要素:

  1. label (标签)
    我们需要在代码的合适位置处定义一个标签,作为 goto 跳转的依据
    标签名的命名规则可以参照变量。
  2. goto label.

我们可以通过一个良好的案例去证明他们。

/*
    goto.c
        简单使用 goto 语句
    BeginnerC
*/
#include <stdio.h>
int main()
{
    goto tag;
    printf("%d\n", __LINE__);
    tag:
    printf("%d\n", __LINE__);
    return 0;
}

在这个案例之中,我们使用 goto tag; 将程序的执行语句直接跳转到了 标签tag 所在出,printf 则负责输出程序执行当前对应的源代码行数(__LINE__ 是一个内置的宏,指出了对应的源代码行数)。

结合 if 语句,实现循环

在具备了逻辑判断与无条件跳转之后,我们就可以实现循环功能。

/*
    if_goto.c
    if - goto 实现循环
    BeginnerC
*/
#include <stdio.h>
int main()
{
    {
        int i = 0;
        label:
            printf("i = %d\n", i);
        if (i < 10)
        {
            i++;
            goto label;
        }
    }
    return 0;
}

我们在这个小程序里面声明了一个变量i,并指示 printf 输出它的值,同时进行逻辑判断,在 i < 10 的时候将程序继续跳转到 printf 函数之处。

这就是一个简单的循环,不过它也体现出了一些不足:

  1. 语法过于怪异,难以理解
  2. 每一次需要命名不同的标签

因此,更好的做法就是使用 C语言 中正式定义的循环语句。

简述:C语言中的循环语句

C语言中的循环语句,用着不同的形式解决着一样的问题。

我们将他们进行罗列

while (condition)
{

}
for (statement; condition; statement)
{

}
do
{

}
while (condition);

可以看到,whiledo-while 都只有一个 condition 执行逻辑判断式,他们两者的区别在于,while 会先执行逻辑判断再决定是否循环,do-while 会先循环再决定逻辑判断。

最复杂的是 for 循环,它在 condition 之外还配合上了两个配套的语句,其中,前者被称为 初始化 语句,会在进入 for 循环前执行一次,后者则会在每一轮循环结束后进行执行。

我们可以对上面的程序进行改写,证明我们的观点。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RUxkXTx2-1683022472415)(foruda.gitee.com/images/1677… “1675377727509.png”)]

/*
    repeat.c
        使用循环语句解决问题
    BeginnerC
*/
#include <stdio.h>
int main()
{
    printf("for :\n");
    for (int i = 0;i < 10;i++)
    {
        printf ("i = %d\n", i);
    }
    printf("while :\n");
    {
        int i = 0;
        while (i < 10)
        {
            printf ("i = %d\n", i);
            i++;
        }
    }
    printf("do-while :\n");
    {
        int i = 0;
        do
        {
            printf ("i = %d\n", i);
            i++;
        }
        while (i < 10);
    }
    return 0;
}

我们使用不同的循环改写了之前的程序,{} 帮助我们将各个部分区隔开来,在 C语言 中,变量的有效范围局限于定义它的 {} 以内(如果没有定义在花括号以内,它就是一个 全局变量,对整个源文件都有效),因此我们需要重新定义 变量i

简述:break & continue

有的时候,我们需要中止我们的循环,或是单方面结束这一轮的循环。

C语言提供 breakcontinue 两者对我们的想法进行支持。

其中,break 可以直接结束循环,而 continue 则仅仅结束 本轮循环