badkk 发表于 2015-2-16 18:36:24

菜鸟求助C语言零基础入门第二章最后一节的程序

#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=18,i=8,q=21,j=8;


运行结果却是:p=15 , i=8,q=22, j=8;

真的想不懂,求各位解答,谢谢。


傲天 发表于 2015-2-16 18:36:25

p=(i++)+(i++)+(i++);这句应该可以理解吧?I++是使用后再++,所以就是3个5相加,结果当然是15了,加完以后,I的值是加了3次,所以为8.
q=(++j)+(++j)+(++j);这句是因为编译器问题,VC++会自动优化,在反汇编里你会看到,是把前两个++J先inc了(就是自加1)然后再加最后一个++J,这样结果就是7+7+8=22.
你如果学会汇编就不会有这个疑问了,0基础汇编里还专门讲了这个问题,可巧我知道了,把分给我吧:titter:

xiamigame 发表于 2015-2-16 18:43:32

编译器的原因 反编译就知道了

马沸腾 发表于 2015-2-16 22:45:19

路过,呵呵呵。我正准备学C,先学的汇编打基础。等我学汇编学腻了就来回答你的问题。

百日维新 发表于 2015-2-23 14:52:14

貌似好高深的样子

wangmeng 发表于 2015-3-1 12:11:30

编译器在读程序时是从上往下顺序读取,例如读完p=(i++)+(i++)+(i++);
i的只会别保留到下一行。

haiouda 发表于 2015-3-1 18:37:18

这个,我前些天也搞不懂;
后来发现这个是无解的(没有标准答案);
现实中,不会遇到这样的应用,不必究结在这里了。

秀丽江山 发表于 2015-3-2 11:04:33

#include<stdio.h>
void main()
{
        int a=5;
        printf("%d\n",a++);/*此处先参与运算后自增1,所以显示为5,但下次使用变量a时,值为6*/

        printf("%d\n",a--);/*此处先运算后自减1,显示为6,下次使用a=5*/

        printf("%d\n",++a);/*此处先自增1后参与运算,显示为6,值为6*/

        printf("%d\n",--a);/*显示为5*/

        printf("%d\n",-a++);/*显示为-5,a值由5自增1成为6*/

        printf("%d\n",-a--);/*显示为-6,a值由6自减为5*/

        printf("%d\n",a);/*显示为5*/
}
这样说懂吧

牡丹花下死做鬼 发表于 2015-3-2 14:14:42

百日维新 发表于 2015-2-23 14:52
貌似好高深的样子

甲鱼害死人@小甲鱼

aswyamato1989 发表于 2015-3-2 15:48:28

这个与编译器有关

yjie934 发表于 2015-3-3 15:52:00

应该是你的编译器有问题
页: [1]
查看完整版本: 菜鸟求助C语言零基础入门第二章最后一节的程序