鱼C论坛

 找回密码
 立即注册
查看: 4632|回复: 10

看过视频,对于i++和++i 的一些习题结果不解

[复制链接]
发表于 2013-5-31 16:16:34 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 wolfmanj 于 2013-5-31 16:19 编辑

看了小甲鱼的c 语言教学视频,对i++和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的结果为什么自己和机器算的结果不同呢?

下面是机器显示的结果:

                               
登录/注册后可看大图


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-5-31 17:22:50 | 显示全部楼层
太多人文这个问题了,我之前也写过一篇i++, ++i的处理的文章,要是敢兴趣可以去看下。
http://bbs.fishc.com/thread-31543-1-1.html
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-5-31 17:27:45 | 显示全部楼层
不同编译器,对于自加自减运算符的处理是不一样的,我那个文章也就说了vs2005对自加自减的处理,楼主要是感兴趣,可以用反汇编看一下汇编代码,当然我那个文章也对自加的各种情况说的比较详细,最主要亮点,
第一,函数栈,从右往左压栈,最先计算最右边的参数值
第二,不同编译器可能push如栈的值会有所不同。
我稍后就楼主这个问题 也反汇编给楼主贴出来讲解一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-5-31 17:30:03 | 显示全部楼层
我这边是vs2005,最后的出来的结果是
15,24,8,8。
估计楼主是用的vc6.0吧
如果楼主能把自己代码的反汇编代码贴出来 我就方便给楼主讲解了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-3 17:53:23 | 显示全部楼层
路过。。。打酱油
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-4 14:32:28 | 显示全部楼层
熊文杰 发表于 2013-5-31 17:22
太多人文这个问题了,我之前也写过一篇i++, ++i的处理的文章,要是敢兴趣可以去看下。
http://bbs.fishc. ...

我看了一下你之前类似问题的回复,对于刚刚学习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给予说明,或许效果会更好。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-4 16:18:42 | 显示全部楼层
熊文杰 发表于 2013-5-31 17:27
不同编译器,对于自加自减运算符的处理是不一样的,我那个文章也就说了vs2005对自加自减的处理,楼主要是感 ...

第一,函数栈,从右往左压栈,最先计算最右边的参数值

压栈 和 先计算哪一个 没什么关系
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-4 16:19:45 | 显示全部楼层
错误的代码
结果不可靠
毫无意义

C语言 未定义行为
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-4 19:24:27 | 显示全部楼层
{:7_155:}支持支持,我会的不多,我觉得加加减减都要看编译器,编译出的结果有可能不同,不要太过纠结吧,如果想知道真相的话,可以学习汇编,一点一点来,肯定会的,我也刚学不久,一起努力,加油吖~~
你可以暂时把它编译成汇编,看看执行的顺序,其实一开始只有几个关键字,不会太难,这样你黎真相又近了一点,加油吖~希望对你有帮助{:7_155:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-4 21:18:08 | 显示全部楼层
wolfmanj 发表于 2013-6-4 14:32
我看了一下你之前类似问题的回复,对于刚刚学习c的菜鸟来说,反汇编还是太高深了,如果反汇编可以领会,类 ...

我这边装不了vc6.0 也没法反汇编看,感觉你分析得很有道理,6.0应该是这么处理的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-4 22:10:46 | 显示全部楼层
路过。。。打酱油
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-27 10:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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