逻辑表达式
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 语句依靠两个要素:
- label (标签)
我们需要在代码的合适位置处定义一个标签,作为 goto 跳转的依据
标签名的命名规则可以参照变量。 - 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 函数之处。
这就是一个简单的循环,不过它也体现出了一些不足:
- 语法过于怪异,难以理解
- 每一次需要命名不同的标签
因此,更好的做法就是使用 C语言 中正式定义的循环语句。
简述:C语言中的循环语句
C语言中的循环语句,用着不同的形式解决着一样的问题。
我们将他们进行罗列
while (condition)
{
}
for (statement; condition; statement)
{
}
do
{
}
while (condition);
可以看到,while 与 do-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语言提供 break 与 continue 两者对我们的想法进行支持。
其中,break 可以直接结束循环,而 continue 则仅仅结束 本轮循环