Chinaunix

标题: 没想明白,为啥的这个数? [打印本页]

作者: playingfly    时间: 2006-02-24 08:44
标题: 没想明白,为啥的这个数?
结果得25 ,想不明白,为啥呢?


#include<stdio.h>
main()
{
        int  b,a=5;
        b=(++a)*(--a);
                printf("%d",b);

}
作者: gooderfeng    时间: 2006-02-24 08:49
是什么没关系,别这么写就还了。
谁这样写谁倒霉
作者: soul_of_moon    时间: 2006-02-24 08:51
知道压栈和出栈吗?知道顺序就容易多了
作者: playingfly    时间: 2006-02-24 08:53
原帖由 gooderfeng 于 2006-2-24 08:49 发表
是什么没关系,别这么写就还了。
谁这样写谁倒霉

呵呵,谢谢

不过还是想弄明白,是哪里的问题

我是不是有些死心眼儿啊  
作者: playingfly    时间: 2006-02-24 08:55
原帖由 soul_of_moon 于 2006-2-24 08:51 发表
知道压栈和出栈吗?知道顺序就容易多了
愿闻其详

作者: wenlq    时间: 2006-02-24 08:58
我 在sco unix  
unixware 上测 都是 30

.L95:
/ int  b,a=5;
movl    $5,-8(%ebp)
/ b=(++a)*(--a);
incl    -8(%ebp)
movl    -8(%ebp),%eax
decl    -8(%ebp)
movl    -8(%ebp),%edx
imull   %edx,%eax
movl    %eax,-4(%ebp)
/ printf("%d",b);
        .text
        pushl   -4(%ebp)
        pushl   $.X97
        call    printf
        addl    $8,%esp
/ }
作者: cjaizss    时间: 2006-02-24 09:05
这种代码在C语言标准里属于未定义
就是编译器编译成什么样的汇编码属于自己看着办
所以最好的办法就是不要去写这样的代码
作者: wenlq    时间: 2006-02-24 09:06
再贴个c++ builder 6 的编译结果
应该说是 编译器相关的。

[ 本帖最后由 wenlq 于 2006-2-24 09:14 编辑 ]

c25.jpg (35.74 KB, 下载次数: 16)

c25.jpg

作者: tyc611    时间: 2006-02-24 09:11
原帖由 playingfly 于 2006-2-24 08:44 发表
结果得25 ,想不明白,为啥呢?


#include<stdio.h>
main()
{
        int  b,a=5;
        b=(++a)*(--a);
                printf("%d",b);

}


因为++a和--a是用前缀表示,所以计算表达式:b=(++a)*(--a)时,先计算++a和--a,再计算b=a*a,故得25(注意区分前缀和后缀)
作者: cjaizss    时间: 2006-02-24 09:16
看该编译器的原则。
不同的编译器编译这一句的时候。可能会认为成

  1. ++a;
  2. --a;
  3. b=a*a;
复制代码

也有可能

  1. tmp1=++a;
  2. tmp2=--a;
  3. b=tmp1*tmp2;
复制代码

还有别的可能
以上都不违反标准
作者: soul_of_moon    时间: 2006-02-24 09:17
不同机子不同?

[ 本帖最后由 soul_of_moon 于 2006-2-24 09:21 编辑 ]
作者: soul_of_moon    时间: 2006-02-24 09:21
难道是CPU调度不同?
作者: net_robber    时间: 2006-02-24 09:21
原帖由 cjaizss 于 2006-2-24 09:05 发表
这种代码在C语言标准里属于未定义
就是编译器编译成什么样的汇编码属于自己看着办
所以最好的办法就是不要去写这样的代码



支持,呵呵,我还真测试了下,在不同平台下,呵呵

不过 Win下 CL  结果确实是25,哈哈
作者: playingfly    时间: 2006-02-24 09:25
原帖由 cjaizss 于 2006-2-24 09:16 发表
看该编译器的原则。
不同的编译器编译这一句的时候。可能会认为成

  1. ++a;
  2. --a;
  3. b=a*a;
复制代码

也有可能

  1. tmp1=++a;
  2. tmp2=--a;
  3. b=tmp1*tmp2;
复制代码

还有别的可能
以上都不违反标准




这两种哪个可得25 ?
作者: playingfly    时间: 2006-02-24 09:26
原帖由 net_robber 于 2006-2-24 09:21 发表



支持,呵呵,我还真测试了下,在不同平台下,呵呵

不过 Win下 CL  结果确实是25,哈哈



我不忽悠大家  
作者: soul_of_moon    时间: 2006-02-24 09:31
刚才把帖删了,因为有一点没弄清,现在终于明白了,大家执行一下下面的程序,就知道了:
1.#include<stdio.h>

main()
{
        int  b,a=5;
        b=((--a)*(--a))*(++a);
                printf("%d,%d\n",b,a);

}

2.
#include<stdio.h>

main()
{
        int  b,a=5;
        b=(++a)*((--a)*(--a));
                printf("%d,%d\n",b,a);

}

3.
#include<stdio.h>

main()
{
        int  b,a=5;
        b=(++a)*(--a)*(--a);
                printf("%d,%d\n",b,a);

}

[ 本帖最后由 soul_of_moon 于 2006-2-24 09:32 编辑 ]
作者: playingfly    时间: 2006-02-24 09:42
原帖由 soul_of_moon 于 2006-2-24 09:31 发表
刚才把帖删了,因为有一点没弄清,现在终于明白了,大家执行一下下面的程序,就知道了:
1.#include<stdio.h>

main()
{
        int  b,a=5;
        b=((--a)*(--a))*(++a);
                prin ...



我这里结果都是


64,4
作者: cjaizss    时间: 2006-02-24 09:43
记得以前计算机二级考试里就出过类似的题目,让我很鄙视出题的人。
反正,这种代码无论从可读性角度还是可移植性角度出发都是很差的。
所以,最好的方法就是不要这么写程序。
套用我同学的话——如果在一个工程中这样写代码的话简直是流氓

作者: playingfly    时间: 2006-02-24 09:46
原帖由 cjaizss 于 2006-2-24 09:43 发表
记得以前计算机二级考试里就出过类似的题目,让我很鄙视出题的人。
反正,这种代码无论从可读性角度还是可移植性角度出发都是很差的。
所以,最好的方法就是不要这么写程序。
套用我同学的话——如果在一个工程 ...


赞同!


我的初衷不是要这么用它;
只是好奇,呵呵

纯属个人娱乐   有点孔乙己了
作者: soul_of_moon    时间: 2006-02-24 09:46
原帖由 playingfly 于 2006-2-24 09:42 发表



我这里结果都是


64,4

不会吧,我这里是完全不同的三个值,难道真与CPU的调度有关?
作者: playingfly    时间: 2006-02-24 09:48
原帖由 soul_of_moon 于 2006-2-24 09:46 发表

不会吧,我这里是完全不同的三个值,难道真与CPU的调度有关?



郁闷了

再一次的,
我没忽悠你

作者: soul_of_moon    时间: 2006-02-24 09:48
36,4
64,4
100,4
作者: cjaizss    时间: 2006-02-24 09:49
真想看个究竟,就
gcc -S *.c
作者: playingfly    时间: 2006-02-24 09:53
原帖由 soul_of_moon 于 2006-2-24 09:46 发表

不会吧,我这里是完全不同的三个值,难道真与CPU的调度有关?



应该与编译器有关。同一台,我在cygwin上得到了 不同的结果
作者: soul_of_moon    时间: 2006-02-24 09:53
算了,既然大家都不同,就不讨论了。
作者: playingfly    时间: 2006-02-24 09:56
哦  谢谢

谢谢楼上的诸位的热心帮忙   
作者: songix    时间: 2006-02-24 10:06
标题: 是表达式求值顺序的问题吧
不同的编译器实现不同。

《C++ Gotchas》上面有这个问题的描述的。
作者: 撒哈拉里的鱼    时间: 2006-02-24 10:06
搞这些P东西,不觉得浪费时间么?
作者: soul_of_moon    时间: 2006-02-24 10:21
原帖由 songix 于 2006-2-24 10:06 发表
不同的编译器实现不同。

《C++ Gotchas》上面有这个问题的描述的。

我去看一下。
作者: playingfly    时间: 2006-02-24 10:34
原帖由 soul_of_moon 于 2006-2-24 10:21 发表

我去看一下。

有电子版的吗?

有的话 发一份给偶吧! 谢谢


playingfly@hotmail.com
作者: cjaizss    时间: 2006-02-24 10:37
原帖由 playingfly 于 2006-2-24 10:34 发表

有电子版的吗?

有的话 发一份给偶吧! 谢谢


playingfly@hotmail.com


学习计算机一个最好的办法就是尽量多的使用一切可使用的资源,比方google.
这本书的电子版下载明明可以在google上搜到,为什么不搜呢?
http://www.newebug.com/ebook/c-cpp/1558.shtml
作者: soul_of_moon    时间: 2006-02-24 10:42
原帖由 cjaizss 于 2006-2-24 10:37 发表


学习计算机一个最好的办法就是尽量多的使用一切可使用的资源,比方google.
这本书的电子版下载明明可以在google上搜到,为什么不搜呢?
http://www.newebug.com/ebook/c-cpp/1558.shtml

搜了几个,都是要money的,你那个乱码,如果兄弟不麻烦,发给我一份,谢谢。zhoudh@jftt.fujitsu.com
作者: playingfly    时间: 2006-02-24 10:44
原帖由 cjaizss 于 2006-2-24 10:37 发表


学习计算机一个最好的办法就是尽量多的使用一切可使用的资源,比方google.
这本书的电子版下载明明可以在google上搜到,为什么不搜呢?
http://www.newebug.com/ebook/c-cpp/1558.shtml

你这个是个目录

收费的  怕怕 :wink:
作者: cjaizss    时间: 2006-02-24 10:47
很可惜,我现在这里没有这本书
作者: playingfly    时间: 2006-02-24 13:31
没找到 这本书


还是想知道 为什么得25

我有些受病了

受不了了
作者: hotwind    时间: 2006-02-24 16:36
不同的编译器不同结果。
作者: macrodba    时间: 2006-02-24 17:21

作者: bollwarm    时间: 2006-02-25 16:28
给你们一个可以下载的连接把
http://cpp.ga-la.com/html/8/10/0510/64.htm
作者: sarahbrightman    时间: 2006-02-25 19:35
提示: 作者被禁止或删除 内容自动屏蔽
作者: songix    时间: 2006-02-26 15:25
标题: Addison Wesley - C++ Gotchas
书我传到这里了,自己去取吧。
http://www.itpub.net/showthread.php?s=&threadid=495894
作者: fedoracore4    时间: 2006-02-26 16:15
我在windows下面用dev-cpp跑出来是36
作者: playingfly    时间: 2006-02-26 22:28
原帖由 songix 于 2006-2-26 15:25 发表
书我传到这里了,自己去取吧。
http://www.itpub.net/showthread.php?s=&threadid=495894
好人啊  谢拉

作者: playingfly    时间: 2006-02-26 22:30
原帖由 fedoracore4 于 2006-2-26 16:15 发表
我在windows下面用dev-cpp跑出来是36


作者: wbenben    时间: 2006-02-26 23:11
004116B6  mov         eax,dword ptr [b]
004116B9  add         eax,1
004116BC  mov         dword ptr [b],eax
004116BF  mov         ecx,dword ptr [b]
004116C2  sub         ecx,1
004116C5  mov         dword ptr [b],ecx
004116C8  mov         edx,dword ptr [b]
004116CB  imul        edx,dword ptr [b]
004116CF  mov         dword ptr [a],edx

不同的编译器实现不同,
以上是vc++ 8.0的汇编码
作者: hkwang66    时间: 2006-02-27 00:09
原帖由 cjaizss 于 2006-2-24 09:43 发表
记得以前计算机二级考试里就出过类似的题目,让我很鄙视出题的人。
反正,这种代码无论从可读性角度还是可移植性角度出发都是很差的。
所以,最好的方法就是不要这么写程序。
套用我同学的话——如果在一个工程 ...

我也比较讨厌这种用法,好像耍小聪明一样,
考试中固然可以但是编写商业代码时,写这种
代码的人的确让人鄙视,我如何遇到写这种代码的人
一定要处罚他。
作者: sarahbrightman    时间: 2006-02-27 00:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: soul_of_moon    时间: 2006-02-27 07:43
原帖由 sarahbrightman 于 2006-2-27 00:36 发表

那个兄台,我也想要一份,谢谢哦

前面有人帖,可下。另外说一下,不要写这种代码,这是没事找事,自己郁闷自己。
作者: net_robber    时间: 2006-02-27 08:42
怎么还在讨论这个问题?????为什么一定要出现这样的代码呢????
作者: ukyo502    时间: 2006-02-27 13:35
9楼说的是
作者: kls0520    时间: 2006-02-27 13:39
应该是先--a   a=4
然后是++a    a=5
最后是a*a     b=25
作者: KingofSC    时间: 2006-02-27 20:12
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2