A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄战胜 黑马帝   /  2012-1-4 14:59  /  2431 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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.
为什么?????

8 个回复

倒序浏览
本帖最后由 罗利民 于 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;



评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
这个肯定是4,因为是p++而不是++p,p++是先运算后自加
回复 使用道具 举报
soh 黑马帝 2012-1-4 19:38:40
板凳
沈样 发表于 2012-1-4 19:35
这个肯定是4,因为是p++而不是++p,p++是先运算后自加

p自加之后还得给c赋值,给c赋值之前就自加过完了吧。
回复 使用道具 举报
这个毕老师在我们前两天上课的时候提到过,说是语法不同。
回复 使用道具 举报
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:09
7#
p++与++p,这个不难区分,特别是学过C的,但一旦与“=”搞在一起,就涉及到深层的东西了,反正java与C的处理不同,详见: http://topic.csdn.net/u/20110827/12/57cdde84-6a4b-48e8-8627-b0fbc8f1f850.html
回复 使用道具 举报
黄秋 黑马帝 2012-1-6 05:15:34
8#
代码: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++。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黄秋 黑马帝 2012-1-6 05:29:34
9#
把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的,就行了。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马