| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1663 人关注过本帖, 1 人收藏
标题:等价的C语言表达式
只看楼主 加入收藏
liu0919
Rank: 2
等 级:论坛游民
帖 子:124
专家分:35
注 册:2013-5-13
结帖率:87.8%
收藏(1)
已结贴  问题点数:3 回复次数:9 
等价的C语言表达式
!(a<=b).等价的C语言表达式不应该是a>b为什么我在书上看到的是(a<=b)||(a>b)
搜索更多相关主题的帖子: 表达式 C语言 
2013-07-26 08:31
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
啥书呀?原话是怎么说的?

不过,你认为的也是错的,谁说 !(a<=b) 等价于 a>b 的呀?不能想当然。
程序代码:
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

int main()
{
    double a, b;
    memset( &a, 0xFF, sizeof(a) );
    memset( &b, 0xFF, sizeof(b) );

    bool x = !(a<=b);
    bool y = a>b;
    printf( "%d %d\n", x, y );

    return 0;
}
输出为 1 0
即 !(a<=b) 和 a>b 并不等价。
2013-07-26 09:02
qjw2719
Rank: 2
等 级:论坛游民
帖 子:21
专家分:33
注 册:2012-3-15
收藏
得分:0 
2013-07-26 09:07
C语言NEW
Rank: 2
来 自:C语言家族
等 级:论坛游民
帖 子:68
专家分:65
注 册:2013-6-26
收藏
得分:0 
!是逻辑非运算,(a<=b)取相反值

C语言菜鸟啦啦啦,必须的。
2013-07-26 10:28
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
!(a<=b)与(a<=b)||(a>b)不等价吧
程序代码:
#include<stdio.h>

void main()
{ int a=3,b=4,m=0;
if(!(a<=b))

printf("%d\n",m);
else
printf("%d",++m);
}
//结果为1,
#include<stdio.h>

void main()
{ int a=3,b=4,m=0;

if((a<=b)||(a>b))
printf("%d\n",m);
else
printf("%d",++m);
}
//结果为0;


思考赐予新生,时间在于定义
2013-07-26 13:07
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
以下是引用rjsp在2013-7-26 09:02:11的发言:

啥书呀?原话是怎么说的?

不过,你认为的也是错的,谁说 !(a<=b) 等价于 a>b 的呀?不能想当然。
#include  
#include  
#include  
 
int main()
{
    double a, b;
    memset( &a, 0xFF, sizeof(a) );
    memset( &b, 0xFF, sizeof(b) );
 
    bool x = !(a<=b);
    bool y = a>b;
    printf( "%d %d\n", x, y );
 
    return 0;
}输出为 1 0
即 !(a<=b) 和 a>b 并不等价。

R版主,你能不能细说一下这段代码怎么得出结论,有点费解

思考赐予新生,时间在于定义
2013-07-26 13:12
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:3 
书上的结果肯定是错的。(a <= b) || (a > b)恒为真。

比较有意思的是2楼的说法。首先,我要肯定楼主的想法,a <= b 等价于 !(a > b)。

然后解释一下2楼代码的结果。

我们进行逻辑判断是建立在有效的数值上的,而2楼故意使用了两个特殊值,这两个值表示未定义结果(NAN)。

这两个值参与逻辑比较的定义与有效的数值是不同的。

NAN与任何值(包括NAN)进行大于、小于、等于的结果都为false。

只有“不等于”的运算结果是true。包括 NAN != NAN 的结果也为真。

这提醒你编程中一定要注意判断数值是否发生溢出。

重剑无锋,大巧不工
2013-07-26 13:37
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 7楼 beyondyf

对于“a <= b 等价于 !(a > b)”,虽然似乎不言而喻,但严格说来,C/C++并没有如此规定。
我想C/C++今后也不会有如此规定,因为这会降低<=、>这些操作符的抽象层次。

当然,你说“a <= b 等价于 !(a > b)”我也无法反对
2013-07-26 15:23
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
以下是引用rjsp在2013-7-26 15:23:44的发言:


对于“a <= b 等价于 !(a > b)”,虽然似乎不言而喻,但严格说来,C/C++并没有如此规定。
我想C/C++今后也不会有如此规定,因为这会降低<=、>这些操作符的抽象层次。

当然,你说“a <= b 等价于 !(a > b)”我也无法反对


嗨,咱又在说两件事了。我所说的是建立在a和b都是正常有效的数值基础上的正常运算下。你所说的是在实际运算中发生溢出或重载改变了运算符定义的情况下。运算符的意义发生了改变,那原有的规则也不复存在了。

考虑的角度不同,这并不矛盾。理论分析阶段可以只考虑a、b有效的情况,实际编码中一定要顾及数据溢出的情况。论坛中关于因溢出而引发的错误数不胜数。

重剑无锋,大巧不工
2013-07-26 17:55
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
收藏
得分:0 
以下是引用beyondyf在2013-7-26 13:37:18的发言:

书上的结果肯定是错的。(a <= b) || (a > b)恒为真。

比较有意思的是2楼的说法。首先,我要肯定楼主的想法,a <= b 等价于 !(a > b)。

然后解释一下2楼代码的结果。

我们进行逻辑判断是建立在有效的数值上的,而2楼故意使用了两个特殊值,这两个值表示未定义结果(NAN)。

这两个值参与逻辑比较的定义与有效的数值是不同的。

NAN与任何值(包括NAN)进行大于、小于、等于的结果都为false。

只有“不等于”的运算结果是true。包括 NAN != NAN 的结果也为真。

这提醒你编程中一定要注意判断数值是否发生溢出。




似乎一般情况下C中用到   !(a>b)   的情况都是在判断语句中(if(!a>b),while(!a>b)),或者的赋值(x=!(a>b))吧

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-07-26 20:39
快速回复:等价的C语言表达式
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.055345 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved