238 lines
9.1 KiB
Markdown
238 lines
9.1 KiB
Markdown
---
|
||
title: Logical Operators and If Statements
|
||
localeTitle: 逻辑运算符和If语句
|
||
---
|
||
# 如果是C语句
|
||
|
||
更改基于环境中某些信息的代码行为的能力称为条件代码流。有时您希望代码根据特定条件运行。在这种情况下,我们可以使用If语句。它也被称为决策声明,因为它根据给定的表达式(或在给定的条件下)做出决定。如果表达式求值为true,那么将执行'if'语句中的代码块。如果表达式的计算结果为false,那么将执行'if'语句结束后(结束大括号之后)的第一组代码。表达式是一个表达式,它具有对布尔变量进行操作的关系和/或逻辑运算符。表达式的计算结果为true或false。
|
||
|
||
## _if语句的_语法
|
||
```
|
||
if (testExpression) {
|
||
// statements
|
||
}
|
||
```
|
||
|
||
## 一个简单的例子
|
||
|
||
让我们看一下这个实例的一个例子:
|
||
|
||
```C
|
||
#include <stdio.h>
|
||
#include <stdbool.h>
|
||
|
||
int main(void) {
|
||
if(true) {
|
||
printf("Statement is True!\n");
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
```
|
||
output:
|
||
Statement is True!
|
||
```
|
||
|
||
就像helloworld.c一样,stdio.h已被包含在内。这个程序的新功能是stdbool.h,它是标准的布尔库 - 它包含的代码可以让我们访问'true'和'false'。
|
||
|
||
上面例子中的新内容是'if'语句。如果括号内的语句为true,则将运行if语句括号内的代码。对于此示例,true为true,因此代码将运行`printf`函数。
|
||
|
||
## 如果别的
|
||
|
||
在'If-else'语句中,如果括号内的语句为true,则将执行'if'语句括号内的代码,如果括号内的语句为false,则括号内的代码为'否则'声明将被执行。
|
||
|
||
当然,这个例子并不是很有用,因为真的总是如此。这是另一个更实用的:
|
||
|
||
```C
|
||
#include <stdio.h>
|
||
|
||
int main(void) {
|
||
int n = 2;
|
||
|
||
if(n == 3) { // comparing n with 3
|
||
printf("Statement is True!\n");
|
||
}
|
||
else { // if first condition is not true, then comes to this block of code.
|
||
printf("Statement is False!\n");
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
```
|
||
output:
|
||
Statement is False!
|
||
```
|
||
|
||
这里有一些不同的重要事情。首先, `stdbool.h`尚未包含在内。这没关系,因为`true`和`false`都没有被使用。在C中,我们将语句视为true和false,即使操作中不涉及true或false。
|
||
|
||
在if语句的括号内也是新的东西: `n == 3` 。这是`n`和数字3之间的比较。 `==`是比较运算符,是C中几个比较运算之一。
|
||
|
||
## 嵌套if-else
|
||
|
||
if-else语句允许在两个可能的替代方案之间进行选择。有时必须在两种以上的可能性之间做出选择。例如,如果参数小于零,则数学中的符号函数返回-1,如果参数大于零,则返回+1,如果参数为零,则返回零。以下C ++语句实现此功能:
|
||
|
||
```C
|
||
if (x < 0)
|
||
sign = -1;
|
||
else
|
||
if (x == 0)
|
||
sign = 0;
|
||
else
|
||
sign = 1;
|
||
```
|
||
|
||
这是一个if-else语句,其中else后面的语句本身就是一个if-else语句。如果x小于零,则sign设置为-1,但如果不小于零,则执行else之后的语句。在这种情况下,如果x等于零,则将sign设置为零,否则将其设置为1。 新手程序员经常使用if语句序列而不是使用嵌套的if-else语句。那就是他们用逻辑等价的形式写上面的内容:
|
||
|
||
```C
|
||
if (x < 0)
|
||
sign = -1;
|
||
if (x == 0)
|
||
sign = 0;
|
||
if (x > 0)
|
||
sign = 1;
|
||
```
|
||
|
||
建议不要使用此版本,因为它不清楚只有一个赋值语句将针对给定的x值执行。此外,它是低效的,因为总是测试所有三个条件。
|
||
|
||
## 比较运算符
|
||
|
||
运营商名称|用法|运营商结果 ---------------------------- |:---------:| --------- -------- 等于| a == b |如果a等于b则为真,否则为假 不等于| a!= b |如果a不等于b则为真,否则为假 大于| a> b |如果a大于b则为真,否则为假 大于或等于| a> = b |如果a大于或等于b则为真,否则为假 小于| a <b |如果a小于b则为真,否则为假 小于或等于| a <= b |如果a小于或等于b则为真,否则为假
|
||
|
||
那个例子也有一个新词: `else` 。在中的代码`else`块只运行,如果内部的代码`if`不运行。
|
||
|
||
我们可以为所有这些运营商做很多事情!考虑以下内容,我们将使用if-else语句:
|
||
|
||
```C
|
||
#include <stdio.h>
|
||
|
||
int main(void) {
|
||
int n = 5;
|
||
|
||
if(n == 5) {
|
||
printf("n is equal to 5!\n");
|
||
}
|
||
else if (n > 5) {
|
||
printf("n is greater than 5!\n");
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
```
|
||
output:
|
||
n is equal to 5!
|
||
```
|
||
|
||
if-else语句附加了'else if'。如果前一个if中的条件为false,则会运行此代码,但会在其自己的括号内添加一个条件,该条件在运行代码之前必须为true。
|
||
|
||
## 逻辑运算符
|
||
|
||
当然,如果不是真的,或者如果它和其他东西都是真的,我们可能会想要发生一些事情。为此,我们有逻辑运算符:! for not,&& for and,and ||为或。让我们来看看这个行动:
|
||
|
||
```C
|
||
#include <stfio.h>
|
||
|
||
int main(void) {
|
||
int n = 5;
|
||
int m = 10;
|
||
|
||
if(n > m || n == 15) {
|
||
printf("Either n is greater than m, or n is equal to 15\n");
|
||
}
|
||
else if( n == 5 && m == 10 ) {
|
||
printf("n is equal to 5 and m is equal to 10!\n");
|
||
}
|
||
else if ( !(n == 6)) {
|
||
printf("It is not true that n is equal to 6!\n");
|
||
}
|
||
else if (n > 5) {
|
||
printf("n is greater than 5!\n");
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
```
|
||
|
||
```
|
||
output:
|
||
n is equal to 5 and m is equal to 10!
|
||
```
|
||
|
||
这是第一组括号: `n > m || n == 5` 。如果n大于m,或者n等于5,则为真.n不大于m,但n等于5.因为其中一个是真的,并且它们由or连接,声明将为真,并且将打印其中的代码。
|
||
|
||
因为之前的代码已经执行,所以它不会检查其他语句 - 如果之前的语句没有被检查,那么只会检查它们。但是,仅仅为了练习,请考虑其余代码将要检查的内容。如果n等于5且m等于`n == 5 && m == 10`则`n == 5 && m == 10`将为真。这是正确的,但如果n为6则不再为真,并且其他内的代码将不会运行。
|
||
|
||
`!(n == 6)`使用括号使操作更加明显。就像在数学中一样,括号可用于操作顺序:括号内的事物将在不在括号内的事物之前执行。所以在这种情况下,将评估`n == 6` ,并且为false。的`!` ,'not',将其从false转换为true,因此此操作返回true。然而,和之前一样,它不会仅仅因为之前的一个陈述是真的而已经运行了。
|
||
|
||
最后, `n > 5`评估为真吗?答案是否定的,因为n _是_ 5,因此它不大于5.因此,此代码不会评估为true。为了使此求值为true,应使用`>=`运算符。
|
||
|
||
## 关于C比较的细节
|
||
|
||
之前你读到比较是在检查某些事情是真还是假,但那真的只有一半是真的。请记住,C关于轻巧且靠近硬件硬件,很容易检查是否为0,其他任何事情都需要更多工作。因此,比较实际上做的是检查某些内容是否为假,是否为0,或者检查它是否为false(任何其他值)。
|
||
|
||
因此,此if语句为真且有效:
|
||
|
||
```C
|
||
if(12452) {
|
||
printf("This is true!\n")
|
||
}
|
||
```
|
||
|
||
按照设计,0为假,按照惯例,1为真。实际上,这里是一个前面描述的`stdbool.h`库:
|
||
|
||
```C
|
||
#define false 0
|
||
#define true 1
|
||
```
|
||
|
||
实际上还有更多,但这是完成所有工作的部分。
|
||
|
||
这两行代码告诉编译器,'false'一词应替换为'0',而'true'一词应替换为'1'。 `stdbool.h`也有一些文档和编译器指令,将在后面讨论,但这两行都是真的。
|
||
|
||
# 技巧和窍门
|
||
|
||
考虑以下代码:
|
||
|
||
```C
|
||
#include <stdio.h>
|
||
|
||
int main() {
|
||
int i=3;
|
||
|
||
if(i=4) {
|
||
printf("This block is executed");
|
||
}
|
||
else {
|
||
printf("NO! I am boss");
|
||
}
|
||
}
|
||
```
|
||
|
||
什么是输出? “不!我是老板”?如果你猜测这个输出那么你错了。 为什么会这样?因为在if语句中你使用“=”而不是“==”运算符。 “==”是比较器。
|
||
|
||
它将在两个变量之间进行比较,但“=”是赋值运算符 当我们说i = 4时,我们只是将值4赋给整数i,并且因为在“C”中每个NON-ZERO值都为真,所以 如果(i = 4)是真实的陈述,则执行此下的指令
|
||
|
||
# 在你继续之前......
|
||
|
||
## 回顾
|
||
|
||
* 'if'语句检查表达式是否为true,然后它在大括号内运行代码。
|
||
* 'else'可以添加到'if'的末尾,并且只有在前一个if(s)语句为false时才会运行。
|
||
* 'else if'也可以添加到'if'的末尾,并且只有在前一个if(s)语句为false时才会运行。
|
||
* 计算机中的所有内容都由数字表示,因此C中的每个比较都可以通过处理数字 - 甚至是真,假和字符等值来完成。
|
||
* 有一堆比较运算符:
|
||
* \==等于
|
||
* !=不等于
|
||
* \>大于
|
||
* <小于
|
||
* \> =小于或等于
|
||
* <=小于或等于
|
||
* 我们还有一些逻辑运算符,它们允许我们将逻辑运算链接在一起:
|
||
* !被称为NOT运算符 - 它反转操作数的状态
|
||
* &&称为AND运算符 - 当两个条件都为真时返回true
|
||
* ||被称为OR运算符 - 当至少一个条件为真时返回true |