| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2807 人关注过本帖
标题:一个很简单的C问题
只看楼主 加入收藏
cartmaple
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-12-26
结帖率:0
收藏
已结贴  问题点数:5 回复次数:14 
一个很简单的C问题
如图,很奇怪 为什么最后加起来是22?



图片附件: 游客没有浏览图片的权限,请 登录注册
2017-08-31 23:37
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:1 
b=++i;
b+=++i;
b+=++i;
2017-09-01 08:06
笨蛋编程
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:65
专家分:131
注 册:2011-8-11
收藏
得分:1 
这问题夯考虑了

除非打算学习 编译原理

不然没什么用

这个结果 一个编译器一个样的
我还觉的他应该得24
2017-09-01 10:05
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:1 
回复 2楼 吹水佬
你这样等效的结果显然是“8   21”。

能编个毛线衣吗?
2017-09-01 10:21
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
以下是引用wmf2014在2017-9-1 10:21:05的发言:

你这样等效的结果显然是“8   21”。

不是这样,又应是怎样?
2017-09-01 11:24
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 5楼 吹水佬
没什么怎样。楼主是问为什么是“8   22”,我以为你能解答出“22”这个结果的。
如果没有“系列点”的解释,按照c运算符优先级理解,3楼的回答也是有道理的:这题的优先级是()>++>+>=,因此先做括号,再做++,在i=8后再做+,结果不就是24了。

能编个毛线衣吗?
2017-09-01 11:48
a1017075043
Rank: 2
来 自:广州
等 级:论坛游民
威 望:1
帖 子:50
专家分:63
注 册:2015-6-29
收藏
得分:1 
为什么不是21或者24呢?22是怎么算来的?

我是小白。。。。
2017-09-01 12:26
mike_free
Rank: 3Rank: 3
来 自:CN
等 级:论坛游侠
威 望:1
帖 子:36
专家分:139
注 册:2017-8-25
收藏
得分:1 
调用Debug,可以看到运行进行的汇编程序如下:
3      {
0x401340    push   %ebp
0x401341    mov    %esp,%ebp
0x401343    and    $0xfffffff0,%esp
0x401346    sub    $0x20,%esp
0x401349    call   0x401950 <__main>
4          int i,b;
5          b = 0;i = 5;
0x40134e    movl   $0x0,0x1c(%esp)
0x401356    movl   $0x5,0x18(%esp)
6          b = (++i)+(++i)+(++i);
0x40135e    addl   $0x1,0x18(%esp)
0x401363    addl   $0x1,0x18(%esp)
0x401368    mov    0x18(%esp),%eax
0x40136c    lea    (%eax,%eax,1),%edx
0x40136f    addl   $0x1,0x18(%esp)
0x401374    mov    0x18(%esp),%eax
0x401378    add    %edx,%eax
0x40137a    mov    %eax,0x1c(%esp)
7          printf("%d  %d\n",i,b);
0x40137e    mov    0x1c(%esp),%eax
0x401382    mov    %eax,0x8(%esp)
0x401386    mov    0x18(%esp),%eax
0x40138a    mov    %eax,0x4(%esp)
0x40138e    movl   $0x403024,(%esp)
0x401395    call   0x401bc0 <printf>
8          while(1);
0x40139a    jmp    0x40139a <main+90>
你仔细阅读第6行语句下的汇编语句就能明白编译器是怎么计算的了。
一般普通编程都不会用这种写法的。

努力就是最大的收获
2017-09-01 14:31
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
简单编译试试:
#include <stdio.h>
void main()
{
    int i, b;
    b=0, i=5;
    b=(++i)+(++i)+(++i);
}
反编:
图片附件: 游客没有浏览图片的权限,请 登录注册

有不同结果的可贴上比较看看
2017-09-01 15:19
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
4:        int i=5,b=0;
00401028   mov         dword ptr [ebp-4],5
0040102F   mov         dword ptr [ebp-8],0
5:        b=(++i)+(++i)+(++i);
00401036   mov         eax,dword ptr [ebp-4]
00401039   add         eax,1
0040103C   mov         dword ptr [ebp-4],eax    ;第一次++i,i=6
0040103F   mov         ecx,dword ptr [ebp-4]   
00401042   add         ecx,1
00401045   mov         dword ptr [ebp-4],ecx    ;第二次++i,i=7
00401048   mov         edx,dword ptr [ebp-4]
0040104B   add         edx,dword ptr [ebp-4]    ;i+i=14,中间变量值暂存在寄存器edx中
0040104E   mov         eax,dword ptr [ebp-4]
00401051   add         eax,1
00401054   mov         dword ptr [ebp-4],eax    ;第三次++i,i=8
00401057   add         edx,dword ptr [ebp-4]    ;edx+i=14+8=22,将中间变量值和i相加,结果仍然放在edx中
0040105A   mov         dword ptr [ebp-8],edx    ;b=edx=22
6:        printf("%d,%d\n",i,b);

能编个毛线衣吗?
2017-09-01 15:55
快速回复:一个很简单的C问题
数据加载中...
 
   



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

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