专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » 逻辑运算符:C中逻辑运算符需要注意的两点 »正文

逻辑运算符:C中逻辑运算符需要注意的两点

来源: 发布时间:星期六, 2008年12月6日 浏览:14次 评论:0
关于C中的逻辑运算符需要注意以下两点:1.求值的顺序,2.范围.下面分别来说下.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
(1)求值的顺序
除了那些两个运算符共享一个操作数的情况以外,C通常不保证复杂表达式的哪个部分首先被求值.例如在下面的语句里,可能先计算表达式5+3的值,也可能先计算9+6的值.
apples = (5 + 3) * (9 + 6);
C语言允许这种不确定性,以便编译器设计者可以针对特定的系统做出最有效率的选择.一个例外是对逻辑运算符的处理.C保证逻辑表达式是从左至右求值的.&&和||运算符是序列的分界点,因此在程序从一个操作数前进到下一个操作数之前,所有的副作用都会生效(如果不了解什么是副作用,看看我上一篇帖子).而且,C保证一旦发现某个元素使表达式总体无效,求值将立刻停止.这些约定使像下面这样的结构成为可能:
while((c == getchar()) != ' ' && c != '\n')
这个结构建立一个循环读入字符,知道出现第一个空格或换行符.第一个子表达式给c赋值,然后c的值被用在第二个子表达式中.如果没有顺序保障,计算机可能视图在c被赋值之前判断第二个子表达式.
下面是一个例子:
if(number != 0 && 12 / number == 2) {
printf("The number is 5 or 6.\n");
}
如果number值为0,那么第一个子表达式为假,就不再对关系表达式求值.这就避免了计算机试图把0作为除数.很多语言都没有这个特性,在知道number为0后,它们仍将继续后面的条件检查.
最后,考虑这个例子:
while(x++ < 10 && x + y < 20)
&&运算符是序列的分界点这一事实保证了在对右边表达式求值之前,先把x的值增加1.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
(2)范围
可以把&&运算符用于测试范围.例如,若要检查90到100范围内的得分,可以这样做:
if(range >= 90 && range <= 100) {
printf("Good show!\n");
}
一定要注意避免效法像下面这样的数学上常用的写法:
if(90 <= range <= 100)
printf("Good show\n");
问题在于该代码是个语义错误,而不是语法错误,所以编译器并不会捕获它(尽管可能会发出警告).因为对<=运算符的求值顺序是从左到右的,所以会把该测试表达式解释为如下形式:
(90 <= range) <= 100
子表达式90<=range的值为1(真)或0(假).任何一个值都小于100,因此不管range的值是什么,整个表达式总为真,所以需要使用&&来检查范围.
大量现有代码利用范围测试来检测一个字符是不是(比方说)小写字母.例如,假设ch是一个char变量:
[ft

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: