黑马程序员技术交流社区

标题: C语言和java中同样的循环,为什么会有不同的运行结果?! [打印本页]

作者: 代臣    时间: 2011-12-24 13:47
标题: C语言和java中同样的循环,为什么会有不同的运行结果?!
本帖最后由 代臣 于 2011-12-28 17:11 编辑

我在论坛上看到的问题,看来别人的解答还是很疑惑:
这是C语言的代码,运行结果为3:
# include <stdio.h>

int main(void)
{
        int j = 0;
        for (int i = 0; i < 3; i ++)
        {
                j = j ++;
        }
        printf("j = %d\n",j);

        return 0;
}
这是java的代码,运行结果为0:
public class Test
{        
        public static void main(String [] args)
        {
                int j = 0;
                for (int i = 0; i < 3; i ++)
                {
                        j = j ++;
                }
                System.out.println(j);
        }
}
请朋友们给予有说服力的解释,谢谢。
作者: 杨旭    时间: 2011-12-24 14:06
本帖最后由 杨旭 于 2011-12-24 14:12 编辑

C不懂,只能回答Java部分
如果LZ想到达到你的目的 请看下面的代码
  1.           int i = 0;
  2.           for (; i < 3; )
  3.           {
  4.                   i = i ++;
  5.           }
  6.           System.out.println(i);
  7.          
复制代码

作者: 杨强    时间: 2011-12-24 14:08
java中 j=j++; 这样的赋值语句等于废话 j++先用j后++ 一直是0赋给0
要想j自增 直接j++;
或者j+=1;
作者: 周吉明    时间: 2011-12-24 19:26
本帖最后由 周吉明 于 2011-12-24 19:28 编辑

j=j++;语句的执行先后是:先执行 j=j 赋值,再执行 j++ 自增语句。此时 j=j++;中,= 左边的 j 等于0,= 右边的 j 等于1;
同一个表达式里面对 j 执行了两次赋值运算 (= 和++), 这样的结果是不确定的。C语言认为 j=1 而进入下一个循环;java语言认为 j=0 而进入下一循环。
作者: blackbansy    时间: 2011-12-25 01:41
本帖最后由 blackbansy 于 2011-12-25 01:42 编辑

这道题只能理解为每种语言的计算方法不一样了。同样的问题也困惑我了很久,是一道C语言题来的。
#include<stdio.h>
void main()
{
int x,y,b1,b2;
x=y=1;
b1=(x++)+(x++)+(x++);
b2=(++y)+(++y)+(++y);
printf("b1=%d\nb2=%d\n",b1,b2);
}

运行结果:b1=3,b2=10;
对于++问题,曾经想过是编译器的问题,当然也认为时一个语言漏洞。暂时不要看得太重。
(技术分欠缺中。。。)
作者: 代臣    时间: 2011-12-28 17:09
周吉明 发表于 2011-12-24 19:26
j=j++;语句的执行先后是:先执行 j=j 赋值,再执行 j++ 自增语句。此时 j=j++;中,= 左边的 j 等于0,= 右 ...

谢评论!
作者: 代臣    时间: 2011-12-28 17:10
周吉明 发表于 2011-12-24 19:26
j=j++;语句的执行先后是:先执行 j=j 赋值,再执行 j++ 自增语句。此时 j=j++;中,= 左边的 j 等于0,= 右 ...

谢评论!
作者: 代臣    时间: 2011-12-28 17:10
周吉明 发表于 2011-12-24 19:26
j=j++;语句的执行先后是:先执行 j=j 赋值,再执行 j++ 自增语句。此时 j=j++;中,= 左边的 j 等于0,= 右 ...

谢评论!
作者: 代臣    时间: 2011-12-28 17:10
周吉明 发表于 2011-12-24 19:26
j=j++;语句的执行先后是:先执行 j=j 赋值,再执行 j++ 自增语句。此时 j=j++;中,= 左边的 j 等于0,= 右 ...

谢评论!
作者: 周吉明    时间: 2011-12-28 17:55
代臣 发表于 2011-12-28 17:10
谢评论!

:L 哥们你要是版主就好了,回答一个问题加四次分:lol




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