+ -
当前位置:首页 → 问答吧 → 这个题目的结果如此诡异

这个题目的结果如此诡异

时间:2010-08-19

来源:互联网

本帖最后由 chinesedragon 于 2010-08-19 17:42 编辑
  1. #include <stdio.h>

  2. int main() {
  3.         int x;
  4.     //int b = 1 && x;
  5.         printf("%d",x == (1 && x));
  6.     getchar();

  7.     return 0;
  8. }
复制代码
为什么我注释掉后的结果就是0,而放开注释的结果为1呢?

我调试时发现没有注释时x=1,注释后x=9591052.

我是在Windows下,用的是BCB6。

请大牛告诉原因。





经过网友讨论,我又将代码改成下面的:
  1. #include <stdio.h>

  2. int main() {
  3.         int x;
  4.     int b = 1 && x;
  5.     printf("x=%d\n",x);
  6.         printf("b=%d\n",b);
  7.         printf("%d\n",x == (1 && x));
  8.     getchar();

  9.     return 0;
  10. }
复制代码
结果是
下载 (6.38 KB)
2010-08-19 17:40



请注意,我用的是BCB6.0,会不会是和编译器有关。
我就是想知道,为什么我定义了b,x就会等于1;而不定义b,x就是个随机值。

作者: chinesedragon   发布时间: 2010-08-19

x没有初始化....

作者: zhaohongjian000   发布时间: 2010-08-19

第一次2分贴决定送给楼主了。

作者: davelv   发布时间: 2010-08-19



QUOTE:
x没有初始化....
zhaohongjian000 发表于 2010-08-19 17:09




    我知道没有初始化。我需要知道的是没有初始化的情况下怎么会出现那样的结果!!!

作者: chinesedragon   发布时间: 2010-08-19



QUOTE:
第一次2分贴决定送给楼主了。
davelv 发表于 2010-08-19 17:18




    我不是开玩笑的哦

作者: chinesedragon   发布时间: 2010-08-19

和那个注释不注释没关系吧,而且x的值由于你没有初始化是不定的
话说输出为1的时候只有两种情况,x为0或者1,其它的由于x的高位都非0,x & 1的值只能是0或者1,所以都不等……
你多验几次确定后再发帖吧,反正得1的概率很低,我这边算了很多次都是0…………
BTW:能得1的rp真好

作者: daybreakcx   发布时间: 2010-08-19

因为定义了b,所以a的位置会有所不同。

作者: davelv   发布时间: 2010-08-19



QUOTE:
和那个注释不注释没关系吧,而且x的值由于你没有初始化是不定的
话说输出为1的时候只有两种情况,x为0或者 ...
daybreakcx 发表于 2010-08-19 17:28




    理论上是1/2^32

作者: hellioncu   发布时间: 2010-08-19



QUOTE:
和那个注释不注释没关系吧,而且x的值由于你没有初始化是不定的
话说输出为1的时候只有两种情况,x为0或者 ...
daybreakcx 发表于 2010-08-19 17:28


是&&不是&...

作者: davelv   发布时间: 2010-08-19

回复 davelv


    不好意思,手误,但是结论貌似还是一样的,囧…………

作者: daybreakcx   发布时间: 2010-08-19

x == (1 && x)
这个表达式结果只能是1或者0吧.

作者: pandaiam   发布时间: 2010-08-19



QUOTE:
和那个注释不注释没关系吧,而且x的值由于你没有初始化是不定的
话说输出为1的时候只有两种情况,x为0或者 ...
daybreakcx 发表于 2010-08-19 17:28




    我将代码改成下面的:
  1. #include <stdio.h>

  2. int main() {
  3.         int x;
  4.     int b = 1 && x;
  5.     printf("x=%d\n",x);
  6.         printf("b=%d\n",b);
  7.         printf("%d\n",x == (1 && x));
  8.     getchar();

  9.     return 0;
  10. }
复制代码
运行结果是:

未命名.JPG (6.38 KB)

下载次数:0

2010-08-19 17:39

作者: chinesedragon   发布时间: 2010-08-19

请注意,我是在BCB6下

作者: chinesedragon   发布时间: 2010-08-19



QUOTE:
回复  davelv


    不好意思,手误,但是结论貌似还是一样的,囧…………
daybreakcx 发表于 2010-08-19 17:31


结果不一样把,&按位与的话,理论上结果为0和1的概率是一样的。而&&逻辑与的话,使用int32的整数,为0的概率等于1/(2^32)

作者: davelv   发布时间: 2010-08-19

x=8436896
b=1
0


gcc下.

作者: pandaiam   发布时间: 2010-08-19



QUOTE:
结果不一样把,&按位与的话,理论上结果为0和1的概率是一样的。而&&逻辑与的话,使用int32的整数,为0的概 ...
davelv 发表于 2010-08-19 17:40




    如果用&&的话,只有当x=0时结果才为0,对吧?

作者: chinesedragon   发布时间: 2010-08-19



QUOTE:
如果用&&的话,只有当x=0时结果才为0,对吧?
chinesedragon 发表于 2010-08-19 17:45


没错,if(1&&x)跟if(x)这两个是等价的

作者: davelv   发布时间: 2010-08-19

我刚才在VC6.0下运行了一下,结果全是0.看来还真跟编译器有关

作者: chinesedragon   发布时间: 2010-08-19

应该是和编译器有关的.

定义b和x没啥关系.

作者: pandaiam   发布时间: 2010-08-19

所以这个题目的结果如此诡异的原因是写的代码很诡异。

作者: davelv   发布时间: 2010-08-19



QUOTE:
所以这个题目的结果如此诡异的原因是写的代码很诡异。
davelv 发表于 2010-08-19 17:52




    这是我在PPURL注册时,网站让算的一道 题

作者: chinesedragon   发布时间: 2010-08-19

本帖最后由 zhanglistar 于 2010-08-19 18:41 编辑

回复 chinesedragon


       木有初始化 x  是随机的     试了几次都是0  
    gcc 4.2.4

作者: zhanglistar   发布时间: 2010-08-19

本帖最后由 daybreakcx 于 2010-08-19 18:56 编辑


QUOTE:
结果不一样把,&按位与的话,理论上结果为0和1的概率是一样的。而&&逻辑与的话,使用int32的整数,为0的概 ...
davelv 发表于 2010-08-19 17:40




结果实际上是一样的,都是x为0或者1的时候结果是1,其它都是0,概率都很低
对于&或者&&和1一起返回值都是0或者1,所以任何非0,1的数值都不可能==,因此结果都是0
对于x为0或者1,结果都是1,不信你可以带一下看看
结论:只有x为0或者1的时候才会输出1,其它都是0,概率的话大概是1/(2^32 - 2),所以既然是验证码,还是输0靠谱点
分析半天我真蛋疼…………

作者: daybreakcx   发布时间: 2010-08-19