荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: cfans (亮亮), 信区: Java
标  题: [合集]结果是0还是1? why?
发信站: 荔园晨风BBS站 (2005年06月30日16:28:37 星期四), 站内信件

☆   1  ──────────── 我是分割线 ─────────────────☆
发信人: crycz (打印刻录CD/DVD 业余编程), 信区: Java
标  题: 结果是0还是1? why?
时  间: 2005年06月03日11:49:24 星期五

    int i = 0;
    i = i ++;
    System.out.println( i );

    谁能说出质的原因?


☆   2  ──────────── 我是分割线 ─────────────────☆
发信人: sunlit (sunny), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日12:09:09 星期五

所以应该是1吧~ 不知道对不对

         这里赋值的时候i=0,可是赋值结束后i要自加



☆   3  ──────────── 我是分割线 ─────────────────☆
发信人: kylt (潜心修炼), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日12:12:29 星期五

自加后的结果并没赋给左边的i



☆   4  ──────────── 我是分割线 ─────────────────☆
发信人: sunlit (sunny), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日12:13:51 星期五

但是要求输出的时候是要输出i啊~自加以后i就等于1了啊




☆   5  ──────────── 我是分割线 ─────────────────☆
发信人: Zeroto (斐菲), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日12:41:01 星期五

典型的二次赋值,第一次是把i本身赋予i,这时候i还是0.接着第二次就是i加一后再赋予i.
所以很明显输出结果是一.
不过这种格式的赋值在老的编译器里面可能会报错的.所以二次赋值不常见,也不推荐用.



☆   6  ──────────── 我是分割线 ─────────────────☆
发信人: sunlit (sunny), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日12:44:48 星期五


                                                                      ~~~~~~~~
                                                          自加后没有赋值了吧?



☆   7  ──────────── 我是分割线 ─────────────────☆
发信人: xhjx (Hibernate), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日12:45:22 星期五

java係0,c好似係1



☆   8  ──────────── 我是分割线 ─────────────────☆
发信人: bach (时光倒转4年), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: Fri Jun  3 12:45:51 2005

为什么赋二次了呢?




☆   9  ──────────── 我是分割线 ─────────────────☆
发信人: sunlit (sunny), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日12:47:13 星期五

恩,这倒有可能,不知道自增自减运算符在java里是怎么规定的




☆  10  ──────────── 我是分割线 ─────────────────☆
发信人: kylt (潜心修炼), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日12:54:47 星期五

有甘嘎事?
我摞vc编绎也是0啊



☆  11  ──────────── 我是分割线 ─────────────────☆
发信人: kylt (潜心修炼), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日12:56:16 星期五


                                                            你都知自加后没赋值
                                                            当然没会输出1。它
                                                            输出的是表达式的值
                                                            不是自加后的i值



☆  12  ──────────── 我是分割线 ─────────────────☆
发信人: sunlit (sunny), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:01:03 星期五

system输出的表达式的值? i不是一个变量嘛?表达式怎么写输出的都是变量
i的值才对呀~




☆  13  ──────────── 我是分割线 ─────────────────☆
发信人: kylt (潜心修炼), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:06:51 星期五

翻翻C语言的书,看看书上怎么说吧
我功力浅薄,不知怎么说了……



☆  14  ──────────── 我是分割线 ─────────────────☆
发信人: crycz (打印刻录CD/DVD 业余编程), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:07:30 星期五

这么多人回贴中.这个正确点.但是没原因.当然了.我也不知道.

结果就是输出 0. 哪位高手能讲讲内在原因!谢谢了.



☆  15  ──────────── 我是分割线 ─────────────────☆
发信人: kylt (潜心修炼), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:09:36 星期五

摘抄一句:

前缀++、--与后缀++、--的区别:
     ++i(前缀++)在使用i之前,使i的值加1,因此执行完++i后,整个表达式和
i的值均为i+1; i++(后缀++)在使用i之后,使i的值加1,因此执行完i++后,整
个表达式的值为i,而i的值变为i+1。



☆  16  ──────────── 我是分割线 ─────────────────☆
发信人: xhjx (Hibernate), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:10:18 星期五

觉得vc会係1
我度冇装vc,去你公司睇睇,哈哈



☆  17  ──────────── 我是分割线 ─────────────────☆
发信人: crycz (打印刻录CD/DVD 业余编程), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:11:46 星期五

要知道C和Java是有很多不同点的.



☆  18  ──────────── 我是分割线 ─────────────────☆
发信人: kylt (潜心修炼), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:11:53 星期五

vc确实系0
呢个结果同编绎器实现都系有关系的,所以如果你用tc系1,我用vc系0都唔怪



☆  19  ──────────── 我是分割线 ─────────────────☆
发信人: kylt (潜心修炼), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:12:40 星期五

这个基本操作是一样的
而且我摘抄这一句也来自java教程



☆  20  ──────────── 我是分割线 ─────────────────☆
发信人: unique (花开四季 香飘八方), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:12:45 星期五


  我用vc怎么是1的




☆  21  ──────────── 我是分割线 ─────────────────☆
发信人: xhjx (Hibernate), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:13:33 星期五

java同c在处理语法上嘎机制唔同嘎



☆  22  ──────────── 我是分割线 ─────────────────☆
发信人: sunlit (sunny), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:13:48 星期五

是呀,如果输出语句是这样的话:printf("%d",i++); 那样就是0
可是输出语句是在i++ 这样的语句以后才执行,这个时候i 已经自加了,也就是说
如果在printf("%d",i);后面再加多一句printf("%d",++i);的话第2次输出结果
就应该是2了




☆  23  ──────────── 我是分割线 ─────────────────☆
发信人: sunlit (sunny), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:14:11 星期五

恩,所以想知道在java里面怎么定义自增自减的




☆  24  ──────────── 我是分割线 ─────────────────☆
发信人: kylt (潜心修炼), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:17:32 星期五

你贴下你的程序?



☆  25  ──────────── 我是分割线 ─────────────────☆
发信人: unique (花开四季 香飘八方), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:19:02 星期五


#include <stdio.h>
void main()
{  int i=0;
   i=i++;
   printf("%d\n",i);
}

你贴下你的程序?



☆  26  ──────────── 我是分割线 ─────────────────☆
发信人: kylt (潜心修炼), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:19:54 星期五

你自己运行下看看就知道是不是2了……



☆  27  ──────────── 我是分割线 ─────────────────☆
发信人: unique (花开四季 香飘八方), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:20:39 星期五

#include <stdio.h>
void main()
{  int i=0;
   i=i++;
   printf("%d\n",i);  ---1
   printf("%d\n",i++);---1
   printf("%d\n",++i);---3
}




☆  28  ──────────── 我是分割线 ─────────────────☆
发信人: kylt (潜心修炼), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:21:10 星期五

我只能说神奇
我的跟你的一样,不过输出的是0
我用vc6



☆  29  ──────────── 我是分割线 ─────────────────☆
发信人: kylt (潜心修炼), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:22:26 星期五

我复制你的程序去运行,结果是0, 0, 2



☆  30  ──────────── 我是分割线 ─────────────────☆
发信人: unique (花开四季 香飘八方), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:22:58 星期五

  我在java里面结果是 0,0,2




☆  31  ──────────── 我是分割线 ─────────────────☆
发信人: sunlit (sunny), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:23:41 星期五

我也是vc6,一样输出为1




☆  32  ──────────── 我是分割线 ─────────────────☆
发信人: crycz (打印刻录CD/DVD 业余编程), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:23:50 星期五

难道系统平台问题?. 当然我更想知道的是java原因!



☆  33  ──────────── 我是分割线 ─────────────────☆
发信人: xhjx (Hibernate), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:25:27 星期五

java係先产生一个内存空间存放初始值,等运算结束后再释放该内存空间



☆  34  ──────────── 我是分割线 ─────────────────☆
发信人: sunlit (sunny), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:28:14 星期五

我的java书上写的++,--与C/C++类似




☆  35  ──────────── 我是分割线 ─────────────────☆
发信人: xhjx (Hibernate), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:28:28 星期五

装了个vc,都係1,唔信上来睇



☆  36  ──────────── 我是分割线 ─────────────────☆
发信人: kylt (潜心修炼), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:29:23 星期五

你落来睇
我度真系0!
系统2000



☆  37  ──────────── 我是分割线 ─────────────────☆
发信人: xhjx (Hibernate), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:30:34 星期五

但係呢个係i=i++,你试试j=i++就知啦



☆  38  ──────────── 我是分割线 ─────────────────☆
发信人: xhjx (Hibernate), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:31:02 星期五

你上次话你公司冇女嘎...........



☆  39  ──────────── 我是分割线 ─────────────────☆
发信人: kylt (潜心修炼), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:32:28 星期五

shift
无叫你来睇女



☆  40  ──────────── 我是分割线 ─────────────────☆
发信人: sunlit (sunny), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:32:48 星期五

应该说问题就出这里
在表达式中把i++赋值给了自己,然后又自加,所以输出为1
如果变量为j的话就是0

 在 xhjx (Hibernate) 的大作中提到: 】



☆  41  ──────────── 我是分割线 ─────────────────☆
发信人: crycz (打印刻录CD/DVD 业余编程), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:38:40 星期五

什么时候shit变成shift了??



☆  42  ──────────── 我是分割线 ─────────────────☆
发信人: sunlit (sunny), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:39:32 星期五

java的编译器在遇到i++和i- -的时候会重新为变量运算分配一块内存空间,以存放原始
的值而C的编译器不会这么做

所以说java跟c的结果是不一样的




☆  43  ──────────── 我是分割线 ─────────────────☆
发信人: kylt (潜心修炼), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:41:02 星期五

shift比较文明



☆  44  ──────────── 我是分割线 ─────────────────☆
发信人: xhjx (Hibernate), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:41:51 星期五

public class test
{
public static void main(String args[])
  {
     int i=0;
     int j;
     j = i++;
     System.out.println("i="+i);
     System.out.println("j="+j);
  }
}




☆  45  ──────────── 我是分割线 ─────────────────☆
发信人: xhjx (Hibernate), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:42:17 星期五

人家以为你英文差,虽然我更差



☆  46  ──────────── 我是分割线 ─────────────────☆
发信人: kylt (潜心修炼), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日13:43:17 星期五

我依家英文确实系差,惊乜
不比当年了……



☆  47  ──────────── 我是分割线 ─────────────────☆
发信人: cfans (亮亮), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日15:55:20 星期五

结果是0
不推荐用这些东西。
我怀疑有语法问题。

and,大家继续灌水。。hoho。。。



☆  48  ──────────── 我是分割线 ─────────────────☆
发信人: cfans (亮亮), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日15:57:50 星期五

如果是
int i = 0;
i++;
System.out.println(i);
那么就是1




☆  49  ──────────── 我是分割线 ─────────────────☆
发信人: sunlit (sunny), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日17:32:28 星期五

以后工作了要写出这种语句还不给人打死...




☆  50  ──────────── 我是分割线 ─────────────────☆
发信人: Dicyson (快乐很难), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日17:44:50 星期五

      结果是0   如果是++i 结果就是1。。。
      至于为什么? 就要问编写高级语言的开发者!!  呵呵
      前缀后缀的问题!


☆  51  ──────────── 我是分割线 ─────────────────☆
发信人: crycz (打印刻录CD/DVD 业余编程), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日21:37:41 星期五

何出此言..多得探索一些东西才会学得多. 虽然不推荐这样写.
但目前好像还没有一人能说出原因.有不少人还说是1呢.
不要整天就光想着做大事(项目)..试问连这么基础的问题都
理解不透彻? 写代码能出神入化吗?

有人会认为我无聊.搞这样的问题来.见谅..但这样能提高本版的人气.何乐不为?



☆  52  ──────────── 我是分割线 ─────────────────☆
发信人: cfans (亮亮), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日21:39:48 星期五

其实,这个问题真的有点太偏了。
而且我已经说了,i=i++这样的语法很奇怪。

欢迎讨论,不过最好还是不要转牛角尖。

谢谢。



☆  53  ──────────── 我是分割线 ─────────────────☆
发信人: sunlit (sunny), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日22:57:21 星期五

哈哈,我又不是讲不能拿来大家讨论,而是讲写出这样的程序可读性大大降低,
以后团队合作不可能coding & debug全都你一个人做,所以程序要通俗易懂.

如果是几个爱好者聚在一起讨论也没什么不好的呀~




☆  54  ──────────── 我是分割线 ─────────────────☆
发信人: sunlit (sunny), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: 2005年06月03日22:58:45 星期五

支持斑竹 ^_^




☆  55  ──────────── 我是分割线 ─────────────────☆
发信人: vbiao (阿标), 信区: Java
标  题: Re: 结果是0还是1? why?
时  间: Sat Jun  4 10:04:37 2005

这里要注意的是 i++ 和 ++i 的区别,这并不是java特有的。
++i 的实质是 i 自增1, 整个表达式的值(即 i++这是个表达式,
和 x+y 一个意思,x+y也是一个表达式)为 i 增1后的值;

 i++ 的实质是 i 自增1, 整个表达式的值为原来的 i 的值,
例如: i=1  ; j =i ++;则 上述语句的结果为 j=1,i=2。
就 i=i++而言,整个运算过程是这样的:首先赋值运算符=的优先级
比自增运算符++低,故先进行 i 的自增运算,i的值由原来的0变为1,
然后进行赋值运算,即 将表达式 i++的值赋给 i,i 的值就变成0了。

其实,只有在考试是才遇得到 i=i++这样的表达式,实际编程中常用
到的是 j=i++;它和 j=i;i++;这两个语句的功能是一样的, 这
样的代码看起来简洁一些,正如你喜欢写 i++而不写 i=i+1一样。


※ 修改:.vbiao 於 Jun  4 10:08:58 2005 修改本文.[FROM: 192.168.1.218]

☆  56  ──────────── 我是分割线 ─────────────────☆
发信人: anguskwan (妈我想你~爸我也想你), 信区: Java
标  题: re: 结果是0还是1? 实质是什么?!!!
时  间: 2005年06月04日10:23:16 星期六

    javap 一下编译过后的class看看~~

    java的编译器在遇到i++和i--的时候会重新为变量运算分配一块内存空间,以存放原
始的值,而在完成了赋值运算之后,将这块内存释放掉,下面首先看一下如果是j=i++的情
况:首先编译器新开辟一块内存,将i的原始值存放在其中,最后这新开辟的内存中的值将
赋值给j,这样j=i++后,j就会得到i的值,而i又将自加,所以,在释放内存之后,原来存
放j和i的地方将得到值将是:j(此时的值等于初始i值)和i(i自加后的值)。但是如果
是i=i++.同样编译器先开辟一块新的内存,然后将这快新内存中的值赋给i(前面是赋给j
),而这快新的内存中保存的是i的原始值。也就是虽然旧内存中i自加了,但是新内存中
的是i的初始值(1);于是新内存中的值(1)把自己又赋给旧内存中的i;像这样循环下去
,实际上就是一个圈了。

( 打印刻录CD/DVD 业余编程) 的大作中提到: 】:     int i = 0; :     i = i ++;



☆  57  ──────────── 我是分割线 ─────────────────☆
发信人: vbiao (阿标), 信区: Java
标  题: Re: re: 结果是0还是1? 实质是什么?!!!
时  间: Sat Jun  4 10:56:08 2005

精神可嘉,赞一个!
但这个问题并不是java的特有的,你说的是你所使用的java编译器是如何实现 i=i++这
个表达式的
运算的问题


※ 修改:.vbiao 於 Jun  4 10:58:55 2005 修改本文.[FROM: 192.168.1.218]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店