鱼C论坛

 找回密码
 立即注册
查看: 3649|回复: 13

鱼C 3.17题目答案不明白

[复制链接]
发表于 2013-5-22 11:58:21 | 显示全部楼层 |阅读模式
1鱼币
#include <stdio.h>
void main()
{
int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d\n",p,q,i,j);
}

15,22,8,8
Press any key to continue

有人能帮我解答为什么是这个些值吗?

最佳答案

查看完整内容

我这边得出的结果和楼主得出的结果有点不一样,我这边是 15,24,8,8 对于自加运算符的处理,会根据编译器不一样所以处理会不一样,不知道楼主是用的什么编译器呢?我这边就来解释下,为什么我的是这样的结果,我的编译器是visual stdio 2005以上是q=(++j)+(++j)+(++j);这一句的反汇编代码,从汇编可以看出,运算都是先自加再来吧自加的结果进行运算。这里仅仅只能说明vs 2005是这样处理的,不代表其他的编译器是这样处理。这个 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-22 11:58:22 | 显示全部楼层
我这边得出的结果和楼主得出的结果有点不一样,我这边是
15,24,8,8

对于自加运算符的处理,会根据编译器不一样所以处理会不一样,不知道楼主是用的什么编译器呢?我这边就来解释下,为什么我的是这样的结果,我的编译器是visual stdio 2005
  1. 00411C03  mov         eax,dword ptr [ebp-14h]
  2. 00411C06  add         eax,1
  3. 00411C09  mov         dword ptr [ebp-14h],eax
  4. 00411C0C  mov         ecx,dword ptr [ebp-14h]
  5. 00411C0F  add         ecx,1
  6. 00411C12  mov         dword ptr [ebp-14h],ecx
  7. 00411C15  mov         edx,dword ptr [ebp-14h]
  8. 00411C18  add         edx,1
  9. 00411C1B  mov         dword ptr [ebp-14h],edx
  10. 00411C1E  mov         eax,dword ptr [ebp-14h]
  11. 00411C21  add         eax,dword ptr [ebp-14h]
  12. 00411C24  add         eax,dword ptr [ebp-14h]
  13. 00411C27  mov         dword ptr [ebp-2Ch],eax
  14.         q=(++j)+(++j)+(++j);
复制代码
以上是q=(++j)+(++j)+(++j);这一句的反汇编代码,从汇编可以看出,运算都是先自加再来吧自加的结果进行运算。这里仅仅只能说明vs 2005是这样处理的,不代表其他的编译器是这样处理。这个结果会根据编译器不同而不同。

评分

参与人数 1鱼币 +5 贡献 +5 收起 理由
Pxinter + 5 + 5 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-22 12:18:58 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-22 13:39:21 | 显示全部楼层
题目是错误的
别说什么编译没报错
能编译不代表对

别说书是这样写的
那只能说明 书是错误的

别说老师是这样教的
那只能说明你很倒霉 教你的老师耶不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-5-22 15:21:36 | 显示全部楼层
哈   这是鱼老师教程的练习题只是不解   跟自个算的不一样发来求解下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-22 15:24:40 | 显示全部楼层
楼主用的是VC6.0吧---就有这种编译问题----visual stdio就和4楼那位是一样的,他讲的也很详细了----
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-23 09:45:05 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-23 21:38:19 | 显示全部楼层
我只是路过打酱油的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-25 01:33:10 | 显示全部楼层
#include <stdio.h>
void main()
{
int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d\n",p,q,i,j);
}

15,22,8,8
Press any key to continue

i++是先使用i,然后才加1
语句p=(i++)+(i++)+(i++);
是就p=5+5+5,然后再执行i=i+1;执行三次,所以i=8;
++j,是先加然后再使用
q在不同编译器会出来不同的结果,VC6.0是22,VS2010是24。
对于VC6.0来说,它的运算顺序是:q=((++j)+(++j)) + (++j)  ,也就是先算前两个++j,然后再算加法,所以就是7+7+8
j最后值是8

评分

参与人数 1鱼币 +5 收起 理由
Pxinter + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-25 06:59:12 | 显示全部楼层
我只是路过打酱油的。向你学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-27 06:27:42 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-31 16:01:08 | 显示全部楼层
本帖最后由 wolfmanj 于 2013-5-31 16:06 编辑

看了上边的解释,还是不太明白,我用的也是vc6.0,

我把上边的i值,打印出来了,不知道对不对:

#include <stdio.h>
void main()
{
  int i=8,j=5,p,q;
  printf("%d,%d\n",++i,i);  /* 打印9,i 值此时9 */
  printf("%d,%d\n",--i,i);    /* 打印8,i 值此时8 */
  printf("%d,%d\n",i++,i);  /* 打印8,i 值此时9 */
  printf("%d,%d\n",i--,i);    /*  打印9,i 值此时8 */
  printf("%d,%d\n",-i++,i); /*  打印-8,i 值此时9*/
  printf("%d,%d\n",-i--,i);   /*  打印-9,i 值此时8 */
  i=5;   /*我又重新给i 赋值为5*/
  p=(i++)+(i++)+(i++); /*我计算的p 值为 5+6+7=18,i 值此时为8*/
  q=(++j)+(++j)+(++j); /*我计算的q 值为 6+7+8=21,j 值此时为8*/
  printf("%d,%d,%d,%d\n",p,q,i,j);
}
i和j的计算结果和机器的一样,就是p和q的结果为什么自己和机器算的结果不同呢?
下面是机器显示的结果:

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-4 14:36:35 | 显示全部楼层
对于刚刚学习c的菜鸟来说,反汇编还是太高深了,如果反汇编可以领会,类似++和 - - 的计算应该不在话下,我现在分析,对于

p=(i++)+(i++)+(i++); /*或许应该双目运算优先,也就是先计算的p 值为 5+5+5=15,然后i 值经历3次自加1的过程,5+1+1+1,最后i值为8*/

  q=(++j)+(++j)+(++j); /*对于++在变量前的算术式中,单目运算优先,j值经历2次自加1的过程j=7,然后计算表达式前面两个括号的和值, 值为 7+7=14,然后j 值再经历1次自加1的过程j=8,此时q的值为14+8的和值,值为22.*/

也就是机器算出的p,q的值为15,22;而计算完后的 i,j 值都是经过3次自加1的过程,值均为8,即i=8,j=8.

不知道我的分析对否,不过如你所说,对于不同编译器所算出结果不同来说,还是会有各自的规律,只是如果只是初学者,类似的问题能不能用同类的编程方法vc6.0给予说明,或许效果会更好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-6 19:07:44 | 显示全部楼层
为什么j值是经历2次自加1的过程而等于7呢?难道运算顺序不是j先加1为6,然后再加1为7,在加1为8,在6+7+8呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-28 03:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表