黑马程序员技术交流社区

标题: 一样的代码,不一样的结果!!!! [打印本页]

作者: 黄战胜    时间: 2012-1-4 14:59
标题: 一样的代码,不一样的结果!!!!
本帖最后由 hzs_android 于 2012-1-4 15:00 编辑

#include <stdio.h>
int main(int argc,char *argv[])
{
        int p = 9,c = 0;
        p = p++%5;
        c = p;
        printf("c=%d",c);
        return 0;
}
C环境下编译运行结果是:5。


class  DemoMathTest
{
        public static void main(String[] args)
        {
                int p = 9,c = 0;
                p = p++%5;
                c = p;
                System.out.println(c);
        }
}
java环境下结果是:4.
为什么?????
作者: 罗利民    时间: 2012-1-4 16:04
本帖最后由 罗利民 于 2012-1-4 18:20 编辑

楼主提的问题我搜了搜,
关于java里的
int p = 9,c = 0;                          //栈里分配一个p,值为9;分配一个c,值为0
                p = p++%5;             //栈里分配一个临时地址,存放p的值,然后p++的值在临时地址;p%5里用的p是第一次分配的p,也就是9,而不是临时变量里的p值,所以,最后p = 4
                c = p;

详见: http://www.blogjava.net/tmpbuf/archive/2007/09/20/146814.html      (这里面解释的很清楚哈)



c里面的
int p = 9,c = 0;
        p = p++%5;               //就不会再给p分配临时地址了,所以p%5后在+1就是5
        c = p;
        printf("c=%d",c);
        return 0;




作者: 沈样    时间: 2012-1-4 19:35
这个肯定是4,因为是p++而不是++p,p++是先运算后自加
作者: soh    时间: 2012-1-4 19:38
沈样 发表于 2012-1-4 19:35
这个肯定是4,因为是p++而不是++p,p++是先运算后自加

p自加之后还得给c赋值,给c赋值之前就自加过完了吧。
作者: 李玉杰    时间: 2012-1-4 23:11
这个毕老师在我们前两天上课的时候提到过,说是语法不同。
作者: 沈样    时间: 2012-1-5 18:06
soh 发表于 2012-1-4 19:38
p自加之后还得给c赋值,给c赋值之前就自加过完了吧。

p=p++%5,p等于9,9%5等于4,这时P++=10了,但是这时第二个值来了p=4,所以p=10被p=4替换,最后p=4,我是这样理解的
作者: 黄秋    时间: 2012-1-6 04:42
p++与++p,这个不难区分,特别是学过C的,但一旦与“=”搞在一起,就涉及到深层的东西了,反正java与C的处理不同,详见: http://topic.csdn.net/u/20110827/12/57cdde84-6a4b-48e8-8627-b0fbc8f1f850.html
作者: 黄秋    时间: 2012-1-6 05:15
代码:int p=9,c=0; p=p++%5; c=p;
主要争议在“p=p++%5;” ,
p = p++%5; 在C里面相当于:
p=p%5;
p=p+1;

接着c=p,自然就是5了。

在JAVA里面相当于:
p=p%5; //p是4
temp=p;p=p+1;p=temp;  //p仍是4

接着c=p,结果c就是5了。

可见,所有的症结出在p=p++。
作者: 黄秋    时间: 2012-1-6 05:29
把LZ的代码简化为下面,就抓住关键了:
  1. public static void main(String[] args){
  2.                 int p=4;
  3.                 p=p++;
  4.                 System.out.println(p);
  5.         }
复制代码

因为JAVA的jvm里面有两个存储区,一个是暂存区(是一个堆栈),另一个是变量区。 p = p++;是先将p的值4 存入暂存区,然后对变量区中的p自加1,这时p在变量区的值确实是5,但是暂存区的是4; 随后将暂存区(堆栈)的值4--- 弹出赋给变量区的p,所以最后p = 4 。想深入的,可再找些资料看看;若不,记住这种情况JAVA是不加1的,就行了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2