--- title: Logical Operators and If Statements localeTitle: 逻辑运算符和If语句 --- # 如果是C语句 更改基于环境中某些信息的代码行为的能力称为条件代码流。有时您希望代码根据特定条件运行。在这种情况下,我们可以使用If语句。它也被称为决策声明,因为它根据给定的表达式(或在给定的条件下)做出决定。如果表达式求值为true,那么将执行'if'语句中的代码块。如果表达式的计算结果为false,那么将执行'if'语句结束后(结束大括号之后)的第一组代码。表达式是一个表达式,它具有对布尔变量进行操作的关系和/或逻辑运算符。表达式的计算结果为true或false。 ## _if语句的_语法 ``` if (testExpression) { // statements } ``` ## 一个简单的例子 让我们看一下这个实例的一个例子: ```C #include #include 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 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 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 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 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