关于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:07 编辑
vc6不符合C标准,建议使用vs2005以后的编译器
其他编译器运行结果为15,24
5+5+5
8+8+8
不要纠结这个问题,因为以后不会用到,有++或--的表达式通常都单独写,不会混在一起
楼主请看 vs2012的汇编代码。结果很明显了。
顺便说一句,像这种问题就不要研究了,平台相关的。如果想明白结果为啥是这样活着那样。
那么请从汇编角度看问题。一切自然很明了了。
3楼说的没错,在小甲鱼的汇编程序中也有讲过这个难题 三楼正解啊 这玩意真心不用纠结的 :ton:本来也有纠结这个问题,现在看来可以不用管了 编程难 发表于 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操作,
可能问的有点关于编译器的编写规则了,但是这也是有道理才这样设计的吧,不会是随便来的吧?
各位老师好!
非常感谢你们的回答,我理解了。以后遇到++或--这样的表达式单独写。 佐少love 发表于 2013-8-22 12:53 static/image/common/back.gif
你好虽然这个和平台相关但是我还是对这个编译器有疑问
图1-1
这个可以 ...
遇到前置++和后置++一起的时候,基本上不同的编译器会有不同的结果的。
前置++ 的 意思是 先++ 再参与运算。
后置++ 的 意思是 先参与运算,再++ 。
所有的问题都在后置++身上。关键在于 什么时候进行++操作。不同的编译器有不同的处理。
所以不要深究。明白原理,剩下的就可以搞通了。 汇编前几节课就有提到这个题,正如3楼所说。 这些++i,i++ 都是会收编译器影响的 没必要纠结 你用的次数基本为0 。都可以替代的 。你如i=i+1。。
这种题 我告诉你 你敢在程序你出现 你就等着被拍死。 新手,学习中,呵呵 {:1_1:}
页:
[1]