| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 604 人关注过本帖
标题:运行结果不懂
只看楼主 加入收藏
a_choat
Rank: 2
等 级:论坛游民
帖 子:60
专家分:44
注 册:2011-11-4
结帖率:83.33%
收藏
已结贴  问题点数:20 回复次数:5 
运行结果不懂
#include
int main(void)

{
   
int a,i=2;
a=(++i)+(++i)+(++i);

    printf("%d",a);
}
我算出来的是12,可是编译的结果是13,何解?
搜索更多相关主题的帖子: include 
2011-12-24 00:32
luchar
Rank: 9Rank: 9Rank: 9
来 自:南京
等 级:蜘蛛侠
帖 子:279
专家分:1263
注 册:2011-11-3
收藏
得分:7 
我倒,我大半夜的看的第二个贴,居然是两个是一样的问题
过一段时间就会看到这个问题,已经不想说了,这种写法超越了c语言的标准,在标准中没有这样的准则,所以不同的编译器会有不同的处理方式,从而得到的答案也会不同,所以说白了,就是不要这样写,也不要问得到什么结果,为什么,因为这个是没有正确答案的
2011-12-24 02:44
C、Gege
Rank: 2
等 级:论坛游民
帖 子:20
专家分:40
注 册:2011-12-24
收藏
得分:7 
回复 2楼 luchar
受教了!
2011-12-24 13:51
于祥
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:5
帖 子:1047
专家分:4132
注 册:2011-4-24
收藏
得分:7 
就是2L说的那样

最基础的往往是你最容易忽略的!
2011-12-24 14:06
a_choat
Rank: 2
等 级:论坛游民
帖 子:60
专家分:44
注 册:2011-11-4
收藏
得分:0 
回复 2楼 luchar
因为之前那封邮件是我发给你的啊~~西西
2012-01-25 14:13
madfrogme
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
$ cat -n test.c
     1    #include<stdio.h>
     2    int main(void) {
     3        int a, i = 2;
     4        a = (++i) + (++i) + ( ++i);
     5        printf("%d\n",a);
     6        return 0;
     7    }
     8   
     9   
wzj@U10:~$ gcc -g test.c
wzj@U10:~$ ./a.out
13
wzj@U10:~$ gdb -q ./a.out
Reading symbols from /home/wzj/a.out...done.
(gdb) disass main
Dump of assembler code for function main:
   0x080483e4 <+0>:    push   %ebp
   0x080483e5 <+1>:    mov    %esp,%ebp
   0x080483e7 <+3>:    and    $0xfffffff0,%esp
   0x080483ea <+6>:    sub    $0x20,%esp
   0x080483ed <+9>:    movl   $0x2,0x18(%esp)
   0x080483f5 <+17>:    addl   $0x1,0x18(%esp)
   0x080483fa <+22>:    addl   $0x1,0x18(%esp)
   0x080483ff <+27>:    mov    0x18(%esp),%eax
   0x08048403 <+31>:    add    %eax,%eax
   0x08048405 <+33>:    addl   $0x1,0x18(%esp)
   0x0804840a <+38>:    add    0x18(%esp),%eax
   0x0804840e <+42>:    mov    %eax,0x1c(%esp)
   0x08048412 <+46>:    mov    $0x80484f0,%eax
   0x08048417 <+51>:    mov    0x1c(%esp),%edx
   0x0804841b <+55>:    mov    %edx,0x4(%esp)
   0x0804841f <+59>:    mov    %eax,(%esp)
   0x08048422 <+62>:    call   0x804831c <printf@plt>
   0x08048427 <+67>:    mov    $0x0,%eax
   0x0804842c <+72>:    leave  
   0x0804842d <+73>:    ret   
End of assembler dump.
(gdb)

程序代码:
   0x080483ed <+9>:    movl   $0x2,0x18(%esp)  把2 代入i
   0x080483f5 <+17>:    addl   $0x1,0x18(%esp)    i加1变为3
   0x080483fa <+22>:    addl   $0x1,0x18(%esp)   i 再加1变为4
   0x080483ff <+27>:    mov    0x18(%esp),%eax  不再加了,把4放入eax register中
   0x08048403 <+31>:    add    %eax,%eax     然后 +4为8,把8放入eax 中
   0x08048405 <+33>:    addl   $0x1,0x18(%esp)  回到原来的i ,把i 加1得5
   0x0804840a <+38>:    add    0x18(%esp),%eax        然后把这个5和8相加 得13


我的gcc做这种运算的时候就是这样处理的
只是说明编译器对这种运算是怎么处理的,
这种代码别写
其实你可以试试
i= 2;
a = (++i ) + (++i)  
是几?难道不是8么??

The quieter you become, the more you can hear
2012-01-25 22:10
快速回复:运行结果不懂
数据加载中...
 
   



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

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