a8077245 发表于 2013-8-21 22:45:58

关于C语言教程里的一个例题结果

各位老师好!
   我是个菜鸟,正在努力学习小甲鱼老师的C语言教程。听到i++和i--这一课。有个例题做不明白,请老师们指点下。
程序如下:

#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);
}


根据运算符优先顺序,先计算( )内的变量。则p的值为5+5+5=15,i最终等于8,i先取值,后自增1
                                                                      q的值为6+7+8=21,j最终等于8。j先自增1,后取值

问题来了,可是为什么我运行程序后的结果q的值等于22呢?不知道哪里错了,请老师指点下菜鸟。谢谢!!

565123 发表于 2013-8-21 23:04:47

本帖最后由 565123 于 2013-8-21 23:07 编辑

vc6不符合C标准,建议使用vs2005以后的编译器
其他编译器运行结果为15,24

5+5+5

8+8+8

不要纠结这个问题,因为以后不会用到,有++或--的表达式通常都单独写,不会混在一起

编程难 发表于 2013-8-22 01:43:09


楼主请看 vs2012的汇编代码。结果很明显了。

顺便说一句,像这种问题就不要研究了,平台相关的。如果想明白结果为啥是这样活着那样。
那么请从汇编角度看问题。一切自然很明了了。

苹果沃珂 发表于 2013-8-22 09:24:41

3楼说的没错,在小甲鱼的汇编程序中也有讲过这个难题

牡丹花下死做鬼 发表于 2013-8-22 09:47:55

三楼正解啊 这玩意真心不用纠结的

zZ_小春 发表于 2013-8-22 11:43:46

:ton:本来也有纠结这个问题,现在看来可以不用管了

佐少love 发表于 2013-8-22 12:53:15

编程难 发表于 2013-8-22 01:43 static/image/common/back.gif
楼主请看 vs2012的汇编代码。结果很明显了。

顺便说一句,像这种问题就不要研究了,平台相关的。如果想 ...

你好虽然这个和平台相关但是我还是对这个编译器有疑问
                           图1-1
这个可以看到是 先 i+i+i 在进行 三次i+1操作,那为什吗?在进行下面操作的时候,要先
1、i+1、i+1放到 i 里面
2、i+i 放到 eax寄存器里面
3、i+1 放到 i 里面
4、eax +i 放到 i 里面 这样操作
根据上面的图1-1为什么不,先进行三次i+1操作在进行i+i操作,
可能问的有点关于编译器的编写规则了,但是这也是有道理才这样设计的吧,不会是随便来的吧?

a8077245 发表于 2013-8-22 12:54:54

各位老师好!
非常感谢你们的回答,我理解了。以后遇到++或--这样的表达式单独写。

编程难 发表于 2013-8-22 13:52:12

佐少love 发表于 2013-8-22 12:53 static/image/common/back.gif
你好虽然这个和平台相关但是我还是对这个编译器有疑问
                           图1-1
这个可以 ...

遇到前置++和后置++一起的时候,基本上不同的编译器会有不同的结果的。

前置++ 的 意思是 先++ 再参与运算。
后置++ 的 意思是 先参与运算,再++ 。

所有的问题都在后置++身上。关键在于 什么时候进行++操作。不同的编译器有不同的处理。
所以不要深究。明白原理,剩下的就可以搞通了。

他小的有 发表于 2013-8-24 23:37:23

汇编前几节课就有提到这个题,正如3楼所说。

好人 发表于 2013-8-25 22:50:30

这些++i,i++ 都是会收编译器影响的 没必要纠结 你用的次数基本为0 。都可以替代的 。你如i=i+1。。
这种题 我告诉你 你敢在程序你出现 你就等着被拍死。

玉宁417 发表于 2013-9-25 10:36:51

新手,学习中,呵呵

阔怀 发表于 2015-8-31 09:53:14

{:1_1:}
页: [1]
查看完整版本: 关于C语言教程里的一个例题结果