标题:
C语言逻辑运算符用法介绍
[打印本页]
作者:
苹果也疯狂
时间:
2015-3-7 12:38
标题:
C语言逻辑运算符用法介绍
一、逻辑运算符
C 语言提供了三个逻辑运算符:
运算符 | 含义 | 学名 | 结合律
--------------------------------------------
&& | 并且 | 逻辑与 | 从左到右
--------------------------------------------
|| | 或者 | 逻辑或 | 从左到右
--------------------------------------------
! | 非 | 逻辑非 | 从右到左
--------------------------------------------
下面我们通过一个简单的例子来学习这三个运算符。
/*--------------------------------------------------------------
| 作者: Antigloss @
Http://Stdcpp.Cn
@ 蚂蚁的 C/C++ 标准编程
|
| 功能: 演示 &&、|| 及 ! 的用法
-------------------------------------------------------------*/
#Include <Stdio.H>
Int Main(Void)
{
Int I_num;
Printf("Please Enter An Integer: ");
Scanf("%D", &I_num);
If ( !I_num ) /* 效果等同于 I_num == 0 */
{ /* 如果用户输入 0 */
Printf("I_num Got A Value Of Zero.
");
}
Else If ( I_num >= 1 && I_num <= 9 )
{ /* 如果用户输入介于 1 到 9 之间(包括 1 和 9)*/
Printf("I_num Is Between 1 And 9, Inclusive.
");
}
Else If ( I_num < -9 || I_num > 9 )
{ /* 如果用户输入小于 -9 或者大于 9 */
Printf("I_num Is Less Than -9 Or Greater Than 9.
");
}
Else
{ /* 其它情况 */
Printf("I_num Is Between -9 And -1, Inclusive.
");
}
Return 0;
}
程序重点:
1. !I_num
如果 I_num 的值不为零,则 !I_num 为假;如果 I_num 的值为零,则 !I_num 为真。
也就是说,! 的作用是把真变为假,把假变成真。
2. I_num >= 1 && I_num <= 9
只有 I_num >= 1 和 I_num <= 9 同时为真,该表达式的值才为真。
3. 别以为 I_num >= 1 && I_num <= 9 可以像数学里那样写成 9 >= I_num >= 1 或者
1 <= I_num <= 9。以 9 >= I_num >= 1 为例,由于关系运算符是从左到右进行结合的,
所以该表达式等同于 (9 >= I_num) >= 1。当 9 >= I_num 为真时,则该表达式为
1 >= 1,其值为真;当 9 >= I_num 为假时,则该表达式为 0 >= 1,其值为假。
4. I_num < -9 || I_num > 9
只要 I_num < -9 和 I_num > 9 当中有一个为真,该表达式的值就为真。
5. If Else If ... Else If ... Else
也许您现在对 If Else If ... Else If ... Else 这种用法仍然不太了解,觉得难以理解。
不用担心,其实很简单,上面的代码我们可以改写成:
If ( !I_num ) /* 效果等同于 I_num == 0 */
{ /* 如果用户输入 0 */
Printf("I_num Got A Value Of Zero.
");
}
Else
{
If ( I_num >= 1 && I_num <= 9 )
{ /* 如果用户输入介于 1 到 9 之间(包括 1 和 9)*/
Printf("I_num Is Between 1 And 9, Inclusive.
");
}
Else
{
If ( I_num < -9 || I_num > 9 )
{ /* 如果用户输入小于 -9 或者大于 9 */
Printf("I_num Is Less Than -9 Or Greater Than 9.
");
}
Else
{ /* 其它情况 */
Printf("I_num Is Between -9 And -1, Inclusive.
");
}
}
}
怎么样,是不是容易理解多了?不过,习惯上,我们会采用前一种写法。其实,如果你习惯了
前一种写法,会觉得前一种写法更容易理解。If Else If ... Else 的基本结构为:
If ( Condition1 )
一条语句/复合语句
Else If ( Condition2 )
一条语句/复合语句
Else If ( Condition3 )
一条语句/复合语句
... ...
Else If ( ConditionN )
一条语句/复合语句
Else
一条语句/复合语句
其执行流程如下图所示:
从这个图中我们可以清楚地看出,当条件为假时,程序会跳到下一条 If 语句,直到条件成立
为止。当某个 If 语句的条件为真时,则执行其下的“一条语句/复合语句”,然后退出整个
If Else If ... Else 结构,转而执行后续语句(本例是执行 Return 0;)。如果没有一个
条件为真,则执行最后那个 Else 后面的“一条语句/复合语句”,然后继续执行后续语句
(本例是执行 Return 0;)。
下面我们来总结一下这三个运算符的作用(Exp 代表表达式):
Exp1 && Exp2:当 Exp1 和 Exp2 同时为真时,Exp1 && Exp2 为真。
Exp1 || Exp2:只要 Exp1 和 Exp2 当中有一个为真,则 Exp1 || Exp2 为真。
当然,Exp1 和 Exp2 同时为真时,Exp1 || Exp2 也为真。
!Exp1:如果 Exp1 为假,则 !Exp1 为真;如果 Exp1 为真,则 !Exp2 为假。
例如:
2 > 5 && 1 > 0 为假,因为 2 > 5 为假。
1 > 2 || 4 < 8 为真,因为 4 < 8 为真。
!(2 < 5) 为假,因为 2 < 5 为真。
二、逻辑运算符的优先级
&& 的优先级比 || 高。它们俩的优先级都低于关系运算符,高于赋值运算符。! 的优先级非常高,比乘除运算符的优先级还要高,和自增自减运算符(前置时)的优先级一样高。例如:
A > B && B > C || B > D
等同于
((A > B) && (B > C)) || (B > D)
如果您不想记住优先级的高低关系,完全没问题,可以不记。反正对于不确定的地方,加上括号就万无一失了。使用括号是非常好的编程风格,这样就算代码的读者不太了解运算符的优先级,也可以看明白。
三、逻辑运算符的求值顺序
C 规定先对 && 或 || 左边的操作数进行运算,然后再对其右边的操作数进行运算。&& 和 || 都是序列点。如果 && 左边的表达式为假,则不再对其右边的表达式求值。只有当 && 左边的表达式为真时,才会对其右边的表达式求值。而对于 ||,如果其左边的表达式为真,则不再对其右边的表达式求值。只有当 || 左边的表达式为假时,才会对其右边的表达式求值。例如:
1 != 1 && 2 == 2 // 不会对 2 == 2 求值,因为 1 != 1 为假,故整个表达式为假
1 == 1 && 2 == 2 // 左右两边都要求值,整个表达式为真
1 == 1 || 2 == 2 // 不会对 2 == 2 求值,因为 1 == 1 为真,故整个表达式为真
1 != 1 || 2 == 2 // 要对 2 == 2 求值,因为 1 != 1 为假。又因为 2 == 2 为真,
// 故整个表达式为真
1 != 1 || 2 != 2 // 因为 1 != 1 和 2 != 2 都为假,故整个表达式为假
因为 && 和 || 都是序列点,所以使用任何符合标准的 C 编译器编译以下表达式的效果都是一样的:
I++ != 20 && (I + J != 30) // 在对 I + J != 30 求值之前,I 的值就已经自增了
I++ != 20 || (I + J != 30) // 在对 I + J != 30 求值之前,I 的值就已经自增了
四、Iso646.H
考虑到某些计算机可能不支持输入 !、| 和 & 这三个字符(如键盘中没有这三个键),C99 新增了头文件 Iso646.H,用于解决这个问题。包含这个头文件之后,我们就可以用 And 来代替 &&,用 Or 来代替 ||,用 Not 来代替 !。我们可以把上面的程序改成这样:
#Include <Stdio.H>
#Include <Iso646.H>
Int Main(Void)
{
Int I_num;
Printf("Please Enter An Integer: ");
Scanf("%D", &I_num);
If ( Not I_num ) /* 效果等同于 I_num == 0 */
{ /* 如果用户输入 0 */
Printf("I_num Got A Value Of Zero.
");
}
Else If ( I_num >= 1 And I_num <= 9 )
{ /* 如果用户输入介于 1 到 9 之间(包括 1 和 9)*/
Printf("I_num Is Between 1 And 9, Inclusive.
");
}
Else If ( I_num < -9 Or I_num > 9 )
{ /* 如果用户输入小于 -9 或者大于 9 */
Printf("I_num Is Less Than -9 Or Greater Than 9.
");
}
Else
{ /* 其它情况 */
Printf("I_num Is Between -9 And -1, Inclusive.
");
}
Return 0;
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0