freeCodeCamp/guide/chinese/c/if-statements/index.md

238 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
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 andand ||为或。让我们来看看这个行动:
```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等于5m等于`n == 5 && m == 10`则`n == 5 && m == 10`将为真。这是正确的,但如果n6则不再为真,并且其他内的代码将不会运行。
`!(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'的末尾并且只有在前一个ifs语句为false时才会运行。
* 'else if'也可以添加到'if'的末尾并且只有在前一个ifs语句为false时才会运行。
* 计算机中的所有内容都由数字表示因此C中的每个比较都可以通过处理数字 - 甚至是真,假和字符等值来完成。
* 有一堆比较运算符:
* \==等于
* =不等于
* \>大于
* <小于
* \> =小于或等于
* <=小于或等于
* 我们还有一些逻辑运算符,它们允许我们将逻辑运算链接在一起:
* 被称为NOT运算符 - 它反转操作数的状态
* &&称为AND运算符 - 当两个条件都为真时返回true
* ||被称为OR运算符 - 当至少一个条件为真时返回true