免费注册 查看新帖 |

Chinaunix

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

[C] 新手问一个关于i++和++i的问题  关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-05 14:46 |只看该作者 |倒序浏览
#include <stdio.h>

#define FUN1(x) (x * x)
#define FUN2(x) (x * x + x)

int main()
{
int i = 3, j, k;
j = FUN1(i++);
k = FUN1(++i);
printf("j = %d, k = %d\n", j, k);

i = 3;
j = FUN2(i++);
k = FUN2(++i);
printf("j = %d, k = %d\n", j, k);

return 0;
}

具体结果我当然可以运行一下这个程序来看,但是对于得到的结果我不能很好的进行分析说明。
大家帮忙看看啊。

多谢!

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
2 [报告]
发表于 2009-05-05 14:47 |只看该作者
很经典的考试面试问题啊

论坛徽章:
0
3 [报告]
发表于 2009-05-05 14:55 |只看该作者

回复 #2 xinglp 的帖子

哈哈,没错!
我就是在有关面试的书中看到的,稍加修改,加上了FUN2而已。

论坛徽章:
0
4 [报告]
发表于 2009-05-05 14:58 |只看该作者
#include <stdio.h>

int main()
{
int i = 3, j, k;
j = i++ * i++;
k = ++i * ++i;
printf("j = %d, k = %d\n", j, k);

i = 3;
j = i++ * i++; + i++;
k = ++i * ++i + ++i;
printf("j = %d, k = %d\n", j, k);

return 0;
}

论坛徽章:
0
5 [报告]
发表于 2009-05-05 15:02 |只看该作者

回复 #2 xinglp 的帖子

第一步:
int i = 3, j, k;   
j = FUN1(i++);  // j = 3*3 =9; 之后 i =5
k = FUN1(++i);  // k = (++i)*(++i) 在乘之前,i所标识的内存单元累加1两次,为7; 然后再相乘 k = 49.

论坛徽章:
0
6 [报告]
发表于 2009-05-05 15:06 |只看该作者
强烈建议:加上括号,不然很容易出错的
先把所有的都用字符串替换先进行:
int i = 3, j, k;
j = i++ * i++;
k = ++i * ++i;
i = 3;
j = i++ * i++; + i++;
k = ++i * ++i + ++i;
然后个人认为进行反汇编是最好理解的:
j = i++ * i++;
00401033  mov         eax,dword ptr [ i]
00401036  imul        eax,dword ptr [ i]
0040103A  mov         dword ptr [j],eax
0040103D  mov         ecx,dword ptr [ i]
00401040  add         ecx,1
00401043  mov         dword ptr [ i],ecx
00401046  mov         edx,dword ptr [ i]
00401049  add         edx,1
0040104C  mov         dword ptr [ i],edx
k = ++i * ++i;
0040104F  mov         eax,dword ptr [ i]
00401052  add         eax,1
00401055  mov         dword ptr [ i],eax
00401058  mov         ecx,dword ptr [ i]
0040105B  add         ecx,1
0040105E  mov         dword ptr [ i],ecx
00401061  mov         edx,dword ptr [ i]
00401064  imul        edx,dword ptr [ i]
00401068  mov         dword ptr [k],edx
j = i++ * i++; + i++;
00401091  mov         edx,dword ptr [ i]
00401094  imul        edx,dword ptr [ i]
00401098  mov         dword ptr [j],edx
0040109B  mov         eax,dword ptr [ i]
0040109E  add         eax,1
004010A1  mov         dword ptr [ i],eax
004010A4  mov         ecx,dword ptr [ i]
004010A7  add         ecx,1
004010AA  mov         dword ptr [ i],ecx
004010AD  mov         edx,dword ptr [ i]
004010B0  add         edx,1
004010B3  mov         dword ptr [ i],edx
k = ++i * ++i + ++i;
004010B6  mov         eax,dword ptr [ i]
004010B9  add         eax,1
004010BC  mov         dword ptr [ i],eax
004010BF  mov         ecx,dword ptr [ i]
004010C2  add         ecx,1
004010C5  mov         dword ptr [ i],ecx
004010C8  mov         edx,dword ptr [ i]
004010CB  add         edx,1
004010CE  mov         dword ptr [ i],edx
004010D1  mov         eax,dword ptr [ i]
004010D4  imul        eax,dword ptr [ i]
004010D8  add         eax,dword ptr [ i]
004010DB  mov         dword ptr [k],eax

晕啊[ i]不带空格还显示不出来

[ 本帖最后由 daybreakcx 于 2009-5-5 15:10 编辑 ]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
7 [报告]
发表于 2009-05-05 15:07 |只看该作者
这种题很晕,项目中没人这么用

论坛徽章:
0
8 [报告]
发表于 2009-05-05 15:11 |只看该作者

回复 #4 langue 的帖子

我的疑问是:
为什么i++ * i++不是3 * 4而是3 * 3呢?

另外,
i = 3;
j = i++ * i++; + i++;
k = ++i * ++i + ++i;
这两句的执行有点诡异。
首先看下面那句,它的结果是k=73,根据这个结果反推应该是8*8 + 9,也就是说,在执行乘法的时候后面加号后面的那个++i是先不执行的。
那么用这个经验来看上面的第二句,为什么不是3*3 + 5呢?事实上,结果是3*3 + 3

论坛徽章:
0
9 [报告]
发表于 2009-05-05 15:12 |只看该作者
对这种题目很无语,难道多拿一两行把代码分开很繁琐或者是很降低效率吗,非得都弄到一起

论坛徽章:
0
10 [报告]
发表于 2009-05-05 15:14 |只看该作者

回复 #7 dreamice 的帖子

呵呵,确实是没人用,我就是好奇,想不通啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP