免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5868 | 回复: 26
打印 上一主题 下一主题

怎么这输出什么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-23 18:09 |只看该作者 |倒序浏览

  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int i=5, j=6, p, q;
  5.         p=(++j)+(++j)+(++j);
  6.         printf("%d\n%d", p,j);
  7.         return 0;
  8. }
复制代码


郁闷了,p为什么不是24呢

论坛徽章:
0
2 [报告]
发表于 2006-11-23 18:17 |只看该作者
5:            p=(++j)+(++j)+(++j);
00401036   mov         eax,dword ptr [ebp-8]
00401039   add         eax,1
0040103C   mov         dword ptr [ebp-8],eax
0040103F   mov         ecx,dword ptr [ebp-8]
00401042   add         ecx,1
00401045   mov         dword ptr [ebp-8],ecx
00401048   mov         edx,dword ptr [ebp-8]
0040104B   add         edx,dword ptr [ebp-8]
0040104E   mov         eax,dword ptr [ebp-8]
00401051   add         eax,1
00401054   mov         dword ptr [ebp-8],eax
00401057   add         edx,dword ptr [ebp-8]
0040105A   mov         dword ptr [ebp-0Ch],edx

论坛徽章:
0
3 [报告]
发表于 2006-11-23 19:08 |只看该作者
Disassembly of section .text:

00000000 <main>:
#include <stdio.h>
int main()
{
   0:   00              halt
   1:   00              halt
   2:   c2 10 5e        subl2 $0x10,sp
        int i=5, j=6, p, q;
   5:   d0 05 ad fc     movl $0x5,0xfffffffc(fp)
   9:   d0 06 ad f8     movl $0x6,0xfffffff8(fp)
        p=(++j)+(++j)+(++j);
   d:   d6 ad f8        incl 0xfffffff8(fp)
  10:   d6 ad f8        incl 0xfffffff8(fp)
  13:   c1 ad f8 ad     addl3 0xfffffff8(fp),0xfffffff8(fp),r0
  17:   f8 50
  19:   d6 ad f8        incl 0xfffffff8(fp)
  1c:   c1 50 ad f8     addl3 r0,0xfffffff8(fp),0xfffffff4(fp)
  20:   ad f4
        printf("%d\n%d", p,j);
  22:   dd ad f8        pushl 0xfffffff8(fp)
  25:   dd ad f4        pushl 0xfffffff4(fp)
  28:   9f ef d2 ff     pushab 0 <main>
  2c:   ff ff
  2e:   fb 03 ef 00     calls $0x3,35 <main+0x35>
  32:   00 00 00
        return 0;
  35:   d4 50           clrf r0
  37:   04              ret
}
  38:   04              ret

论坛徽章:
0
4 [报告]
发表于 2006-11-23 20:14 |只看该作者
p=(++j)+(++j)+(++j); 是无定义的,其结果不确定。上面两位给出的汇编只是其中一种可能的实现方式,所以说明不了什么问题。这样做也说明了两位其实还不明白这种无定义的现象。

具体可参见这个帖子:http://bbs.chinaunix.net/viewthread.php?tid=851568

论坛徽章:
0
5 [报告]
发表于 2006-11-23 20:18 |只看该作者
多谢

论坛徽章:
0
6 [报告]
发表于 2006-11-24 09:38 |只看该作者
怎样叫无定义呢,我怎么也查不到啊,请大哥简单说个

论坛徽章:
0
7 [报告]
发表于 2006-11-24 10:58 |只看该作者
>> 怎样叫无定义呢,我怎么也查不到啊,请大哥简单说个

我在上面列出的一个帖子中做了简单的说明。

另外,关于楼主和你的这个问题,也可参考 C FAQ (http://c-faq.com/)“3. Expressions”部分的说明,说得比较详细一些。

论坛徽章:
0
8 [报告]
发表于 2006-11-24 10:59 |只看该作者
原帖由 wodetian 于 2006-11-23 18:09 发表

  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int i=5, j=6, p, q;
  5.         p=(++j)+(++j)+(++j);
  6.         printf("%d\n%d", p,j);
  7.         return 0;
  8. }
复制代码


郁闷了,p为什么 ...


学过编译原理,你就会知道答案了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2006-11-24 11:07 |只看该作者
原帖由 chzht001 于 2006-11-24 10:59 发表

学过编译原理,你就会知道答案了

悟空,你又在吓唬我。
这个和编译原理可没什么关系。

论坛徽章:
0
10 [报告]
发表于 2006-11-24 11:14 |只看该作者
原帖由 flw 于 2006-11-24 11:07 发表

悟空,你又在吓唬我。
这个和编译原理可没什么关系。


怎没关系?
语法树啊
看实现方式
对于gcc编译器
在算第一个+时先求出两个变量的值,++i和++i,由于是同一个变量因此在+时是两个两次++i后的值相加,并放在临时变量中再算第三个++i时就像一般思维那样了

没吓你吧,大牛

[ 本帖最后由 chzht001 于 2006-11-24 11:20 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP