/***
 *输出结果是多少?
 */
public class Inc{
 
public static void main(String argv[]){
                Inc inc = new Inc();
                int i =0;
                inc.fermin(i);
                i = i++;
                System.out.println(i);
        }
        void fermin(int i){
                i++;
        }
}
输出结果是0,为什么?
帮忙分析一下!!!

解决方案 »

  1.   

    java 方法的参数不能返回内部运算结果,也就是 inc.fermin(i) 不会自动返回自动加1的结果,所以仍然是 0,这样修改:void fermin(int i){ 
                    i++; 
    return i;
            } i=inc.fermin(i);
    i++; System.out.println(i); 
      

  2.   

    public static void main(String argv[]){
                    Inc inc = new Inc();
                    int i =0;
                    //i = 0;
                    inc.fermin(i);
                    //i = 0; fermin 没有返回值
                    i = i++;     
                   //先赋值 i = 0 ; 如果是 ++i 先加后赋值 i = 1;
                    System.out.println(i);
            }
            void fermin(int i){ //第二个 i , 字同范围不同
                    i++;
            }
      

  3.   

    JAVA中方法都是传值调用,并不会改变参数的值,
    i = i++;// 先引用再赋值
    i = ++i; // 先赋值再引用, 改下就知道了
      

  4.   

    楼上所做修改完全正确,但是只说明了第一个错误,即对于参数传递的理解错误.对第二个错误,I=I++,因为I++要延迟执行,所以在本表达式中并不执行+1操作,只有到下一语句才会执行,而此时又将I++的值赋回I,因此导致值无法发生改变.因此虽然在程式中看起来做过两次修改,而实际上值没有任何变化.
      

  5.   

    关键是 i = i++;  这句;记得以前有篇帖子这样说的i = i++;  等同于  
     
    int temp=i;i=i+1;i=temp;期待高手解答。
      

  6.   

    1楼的朋友,void类型方法能"return i;"吗?
      

  7.   

    现在最关键的地方是i=i++; 是怎么运算的?LZ不是要区分i=i++;和i=++i;的区别i=i++;的工作原理是怎么样的?5楼的回答虽然正确,但是不能信服,可以麻烦5楼的兄弟把以前的帖子的地址发出来让大家研究一下吗?非常感谢
      

  8.   

    在下在看scjp题的时候碰到的这个题,在下现在明白了呵呵!,谢谢各位了
    自学的,学的都不系统,一提就恍然大悟了;
    是函数传参和++运算符的问题.
      

  9.   

    inc.fermin(i); // java是传值的,参数i在方法里增加不会影响原来的i
    i = i++; //i++是先返回值然后再+1,++i于此正相反
      

  10.   

    我举个例子
    1. int i=0;
       i++;//此时i为0,执行下一语句时i才改变
       System.out.println(i);//此时i为1
    2. int i=0;
       ++i;//此时i为1
       System.out.println(i);//此时i为1
      

  11.   

    public class Inc{ 
      
    public static void main(String argv[]){ 
                    Inc inc = new Inc(); 
                    int i =0; 
                    inc.fermin(i); //这句有没有都一样.
                    i = i++; //I=0;
                    System.out.println(i); 
            } 
            void fermin(int i){ 
                    i++; //局部变量I=0;执行下句时I=1;
            } 
      

  12.   

    首先VOID 无返回值,你写的函数要不要一杨,关键是 i = i++; 
    // 先引用再赋值 个人见解
      

  13.   

    void fermin(int i)
    这个函数没有用,改成这样的
    public static void main(String argv[]){ 
         int i =0; 
         i++; 
         System.out.println(i); 
      

  14.   

    public class Inc{
     
    public static void main(String argv[]){
                    Inc inc = new Inc();
                    int i =0;
                    inc.fermin(i);//因为java是值传递所以这句不改变i的值
                    i = i++;//这样赋值无效;改为:i++
                    System.out.println(i);
            }
            void fermin(int i){
                    i++;
            }
    }
      

  15.   

    /***
     *输出结果是多少?
     */
    public class Inc{
     
    public static void main(String argv[]){
                    Inc inc = new Inc();
                    int i =0;
                    inc.fermin(i);//传值,变量i本身值不变
                    i = i++;//分两步,首先i++,变量i的值变为1,但是表达式i++的值是i原来的值0;
                            //第二步,将表达式i++的值0赋给变量i,这时变量i的值还是为0。       
                    System.out.println(i);//理所当然输出的值是0咯
            }
            void fermin(int i){
                    i++;
            }
      

  16.   

    首先fermin是void类型,不返回任何值,所以即使i++也是徒劳
    其次i = i++,i++是先返回值然后再+1,++i于此正相反
      

  17.   

    顶 一个
    i = i++  相当于 temp=i  ;i=temp ; temp =temp+1
      

  18.   

    我的理解是:第一个方法:inc.fermin(i)中的i是内部变量,而非外部变量,因此其作用域是私有型,对外无任何影响。
               再则,i++是等到下一个执行语句后,才能执行赋值。
      

  19.   

    Java 编程语言只有值传递参数。当一个对象实例作为一个参数
    被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的
    方法中改变,但对象的引用是永远不会改变的。
      

  20.   

    肯定是 在main函数里面建立的内存  调用的方法没有 改变他的值  而前面的i++  是在下一次的时候加1;
      

  21.   


    i   =   i++  在C中是未定义的情况,可以进行如下操作:     
      1)   i++;   i   =   i     
      2)temp   =   i;   i++;   i=temp     
        
      而Java明確規定了   i   =   i   ++   是進行第二种操作
    看看这个帖子:http://topic.csdn.net/t/20060426/20/4716358.html
      

  22.   

    我只是初学者,
      我哥说的java里面的一切传递都是引用的传递,我是用别人教我的堆栈来看值程序里面值的变化,你用这个试试.
      

  23.   

    方法传递参数,不能改变参数的值,
    i=i++ 是先把i赋值给i,然后++吧
      

  24.   


    void 和return i 
    矛盾了。
      

  25.   

    问题i=i++;
    ++优先级比=高
    1.先计算i++
    将i++看成一表达式,该表达式值为0,即i++值为0,而i=1
    2.计算赋值
    将表达式i++的值赋给i,即i=0
      

  26.   

    三点:一、变量i作用域的问题
          二、i++的问题‘
          三、返回类型问题
    这三个问题搞定,这题就搞定了。
    LZ知道是怎么回事了吧。
      

  27.   

    public class Inc{ 
      
    public static void main(String argv[]){ 
                    Inc inc = new Inc(); 
                    int i =0; 
                      //调用方法的时候由于. 传入的 值类型所以所以 改变只是一个副本.                 inc.fermin(i); 
                        //所以调用之后 i 还是  0                    // i++ 把 O 这个值付给了 i;                i = i++; 
                          //所以这时的i还是0                    
                    System.out.println(i); 
            } 
            void fermin(int i){ 
                    i++; 
            } 

      

  28.   

    如果程序这样是不是结果就变了呢?可不可以这样理解?
     public class Inc{  
       
    public static void main(String argv[]){  
                    Inc inc = new Inc();  
                    int i =0;  
                      //调用方法的时候由于传入的值类型,所以改变只是一个副本.                 
                     inc.fermin(i);  
                        //所以调用之后i还是0         // i++ 把 O 这个值付给了 i;              
                      i = i++;  
                          //所以这时的i还是0                     
                    System.out.println(i);  
            }  
           int fermin(int i){  
                    i++; 
             return  i;
            }  
    }  
      

  29.   

    我有个地方不明白:
    i=i++;
    是先返回i的值后, i再加1。
     也就是说
    System.out.prinln(i); 中的i应该是加1之后的了。那就应该成1个了。小弟愚笨,大哥们,给疏通一下啊!
      

  30.   

    public static void main(String argv[]){ 
                    Inc inc = new Inc(); 
                    int i =0; 
                    //i = 0; 
                    inc.fermin(i); 
                    //java 不会把fermin运算结果自动返回给i,所以i = 0;
                      i = i++;      
                   //先赋值 i = 0 ; 如果是 ++i 先加后赋值 i = 1; 
                    System.out.println(i); 
            } 
            void fermin(int i){ //第二个 i , 字同范围不同 
                    i++; 
            } 
    } 给你举个例子你看看
    public class LocalVariables { public static void main(String argv[]) {
    LocalVariables lv = new LocalVariables();
    int i = 0;
    lv.fermin(i);
    i = i++;
    System.out.println("i= " + i);
    System.out.println("lv.fermin(i)= " + lv.fermin(i));
    } int fermin(int i) {
    return ++i;
    }
    }
    输出:
    i= 0
    lv.fermin(i)= 1
      

  31.   


    很正常啊100%为0
    i++ 必须执行一次才会加1的!
    inc.fermin(i); 进去就是0!
    i是基本类型就算在fermin()方法中把i变成1了但是它不会指向main中的i,
    i=i++也是必须执行一次后才会加1
    然后println()所以是0;
      

  32.   

    public class Inc{ 
      
    public static void main(String argv[]){ 
                    Inc inc = new Inc(); 
                    int i =0; 
                    inc.fermin(i); 
                    i = i++; //先赋值,然后加1
                    System.out.println(i); 
            } 
            void fermin(int i){ 
                    i++; //这里面的对外面的i没有影响的,范围不同
            } 

      

  33.   

    我郁闷,i++有那么可怕吗???
    temp = i++;
    相当于
    temp = i;
    i = i+1;
    而那个函数里面的i 是一个临时变量,不会影响i的值的
      

  34.   

    归结一点:基本数据值传递!
    i是一个int基本数据,传给方法的是i的一个拷贝,i的拷贝在fermin(int i)方法中增值1了,i并没增值。看如下CODE:
     void fermin(int i){   
          i++; 
          System.out.println(i); //值为1;
     }
      

  35.   

    ***************************************************************************    思想决定行动,交流产生力量。   
    程序员在深圳QQ群大集    专业分类:    
    程序员在深圳JAVA群4247660    
    程序员在深圳c++群15195967    
    程序员在深圳.NET群Ⅱ:12203296    
    程序员在深圳TCP/IP协议栈开发:16956462    
    程序员在深圳JS & AJAX群:12578377    
    程序员在深圳英语学习群:23864353    
    深序员在深圳VB:11055959    
    程序员在深圳c++Ⅱ17409451    
    程序员在深圳c++群15195967    
    程序员在深圳嵌入式开发群37489763    
    程序员在深圳移动开发群31501597    
    程序员在深圳创业群33653422    不限专业分类:    
    高级群:17538442    
    第三群:2650485    
    第二群:7120862    
    第五群:29537639    
    第四群:28702746    
    第六群:10590618    
    第七群:10543585    
    第八群:12006492    
    第九群:19063074    
    第十群:2883885    
    第十一群:25460595    
    第十二群:9663807    深圳程序员QQ群联盟成立两年多,拥有三十个以上的QQ群,人数达两千多人,有30%以上的成员的经验丰富   的老手,包括国内外顶级大公司的成员(如微软、IBM,SUN,华为)、国内著名高校和研究院成员,和有   丰富实践经验的高级程序(包括参加过上亿元的项目的架构师),有很热爱技术的成员(包括自己写过嵌入   式操作系统),还有少数女程序员。   现推介如下QQ群,如有兴趣速速加入:深程高级群:17538442(此群不欢迎新手,已经在深圳工作的,月薪   6K以下的不欢迎)c++:15195967 .NET:12203296 mobile:31501597嵌入式:37489763 JAVA:4247660      
    ——————————————————————————————————————————     
    希望大家不要认为群能给你送来什么,这只是一个平台,让同等水平的程序员有个交流的机会或许能得到   一点信息或许能带来一点启发。   
    有人说常聊QQ的人肯定技术不怎么样,但其实很多技术高朋友不需要做一些简单的重复劳动所以还是有   时间聊天的。    *****************************************************************************
      

  36.   

    嘿!!!       http://www.japee.com.cn/jew/pages/Main.aspx
      

  37.   

    嘿嘿!!!http://www.japee.com.cn/jew/pages/Main.aspx
      

  38.   

    楼上同仁们已经说的很清楚,我在补充下
    void
     fermin(int i) // 这里既然是void 说明这个函数不会有返回值,可以直接忽略掉这个方法!接下来我们分析 i=i++; // 这个i++尤为重要, 先操作后赋值 也就是说先做了i=i的操作后再给i++,i=0 所以i=i i被赋值为0 然后0被输出。
      

  39.   

    [java]
    public class Inc{ public static void main(String argv[]){ 
                    Inc inc = new Inc(); 
                    int i =0; 
                    inc.fermin(i); 
                    i = i++;//因为i为0,因此i++这个表达式也为0,虽然i已经加1了,但是经过赋值以后又变回了0. 
                    System.out.println(i); 
            } 
            void fermin(int i){ //因为i是简单类型(prime type)所以只传递值,而不会传递变量地址。
                    i++; 
            } 

    [/java]