`
shenlvcheng
  • 浏览: 17209 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

i=i++完美解释!

阅读更多
public class Increment {
    public static void main(String[] args) {
        int j = 0;
        for (int i = 0; i < 100; i++)
            j = j++;
        System.out.println(j);
    }
}

 

 

答案是:0

很多人不能理解为什么!看了这个帖子,可以帮你完美解释这个问题!

 

完美解释:

 

 

学习过一门计算机语言的人一定知道j=i++的运算结果,整个表达式的值为i,而i的值变为i+1;那么i=i++又是一个什么情况呢?下面分别用java 和 c 两种语言来做个测试:
  
  JAVA:
  
  

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

   
  
  
  C:
  

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

 
  

   
  你也许会问,这么简单的程序会有什么问题呢?是的,如果不相信的话,你可以运行一下这两个程序,得到的结果非常让人震惊。
  
  第一个JAVA程序得出的结果如下:
  
  i=0
  i=0
  i=0
  i=0
  i=0
  
  而第二个C程序得出的结果如下:
  
  i=1
  i=2
  i=3
  i=4
  i=5
  
  同样都是i=i++,为什么得出的结果会有这么大的差异呢?原来是在编译器上出了问题,java的编译器在遇到i++和i- -的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉,下面首先看一下如果是j=i++的情况:
   
  i的原始值存放在后开辟的内存中,最后这个值将赋值给j,这样j=i++后,j就会得到i的值,而i又将自加,所以,在释放内存之后,原来存放j和i的地方将得到值将是:j(此时的值等于初始i值)和i(i自加后的值)。
  
  明白了上面的问题,让我们接下来看看i=i++的情况:

     
  
  所以这样最后一次循环内的结果仍旧是i(即0)。
  
  而C语言中的i=i++就只是完成i++的内容,所以结论会不同。这种情况说明java和c的处理语法的机制不同,如果在程序中只输入i++就不会出现这个方面的问题,所以大家在以后的程序中如果使用到i=i++的时候要格外小心,一般只需要用i++就不会有问题了。

分享到:
评论

相关推荐

    完数的判断txt

    sum += j; } } ``` 内层循环通过变量 `j` 遍历从1到 `i` 的一半(因为一个数的最大真因数不会超过其本身的一半),检查 `j` 是否为 `i` 的因数。如果是,将 `j` 加到 `sum` 中。 #### 4. 完数判断与输出 ```java ...

    专题资料(2021-2022年收藏)关于java中i=i的解释.doc

    Java 语言中的 `i=i++` 这个表达式是一个典型的自增运算符使用的例子,它揭示了 Java 编译器处理这种复合赋值语句的机制与 C/C++ 的不同之处。在 Java 中,`i++` 和 `++i` 两者的主要区别在于操作顺序:`i++` 是先...

    java实验报告 行列对齐的九九表

    但这个解决方案并不完美,因为它只考虑了特定数字范围的情况,并且依赖于硬编码的条件。一个更为通用的方法是使用格式化字符串来确保每个乘积的宽度一致,例如使用`String.format()`方法。 下面是一个使用格式化...

    循环结构程序设计完美版资料.ppt

    sum += i; printf("sum=%d\n",sum); } ``` * 求t=1*2*3*4*5……*n ```c main() { int n, i; double t=1.0; printf("input n: "); scanf("%d",&n); for (i=1;i&lt;=n;i++) t=t*i; printf("t=%e",t); } ``` *...

    C/C++程序设计员应聘常见面试试题深入剖析

    许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最简单的 strcpy 函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个 strcpy 函数吗?我们都觉得自己能,可是...

    C语言常用算法

    if (i % j == 0) sum += j; } if (sum == i) printf("%d ", i); } } ``` #### 5. 实数的四舍五入 - 通常使用`round()`函数实现。 #### 6. 逻辑运算及扩展问题 - **求解能被7或11整除的所有整数** - 示例...

    计算机二级C语言初级经典程序

    a[i][j] = a[i - 1][j] + a[i - 1][j - 1]; for (i = 0; i &lt;= 5; i++) { for (j = 0; j &lt;= i; j++) printf("%4d", a[i][j]); printf("\n"); } } ``` #### 7. 学生成绩统计 **知识点**: - **多维数组应用**:...

    C++经典面试题2C++经典面试题2

    同样,`strlen`函数的完美实现如下: ```cpp int strlen(const char* str) { assert(str != NULL); int length = 0; while(*str++) { length++; } return length; } ``` 这里,我们手动遍历字符串直到遇到'\0'...

    蓝桥题目思路文档版.pdf

    i += k - 1; } } ans = min(ans, tot); } cout ; } ``` 以上是针对这三个问题的详细解答及示例代码实现。这些题目涵盖了基本的数据结构(如 map 和数组)、控制结构(如 if 语句和循环)以及简单的算法思想。...

    C程序员面试

    一个完美的`strlen`函数应该考虑到以下几个方面: ```c int strlen(const char *str) { assert(str != NULL); int len = 0; while (*str++ != '\0') { len++; } return len; } ``` - **输入参数检查**:使用...

    MAX SUM 给定由n整数(可能为负数)组成的序列 {a1,a2,…,an},求该序列形如ai+ai+1,…,+aj的子段和的最大值。当所有的整数均为负数时定义其最大子段和为0。

    - 如果`sum &gt; 0`,则将`a[i]`加入到当前子序列中,即`sum += a[i]`。 - 否则,重新开始一个新的子序列,即`sum = a[i]`。 - 更新最大子段和`maxSum`,即`maxSum = max(maxSum, sum)`。 3. **处理特殊情况**: -...

    canvas完美绘制中国象棋棋盘

    本教程将深入讲解如何使用Canvas来完美地绘制一个中国象棋的棋盘,这对于初学者理解Canvas的基本操作和绘图原理极具帮助。 首先,我们需要在HTML页面中创建一个`&lt;canvas&gt;`元素,为其指定一个ID以便于JavaScript访问...

    C语言

    s += t; a = a * 10 + a; n--; } printf("a+aa+aaa++aa=%d", s); return 0; } ``` #### 关键知识点 1. **算术运算**: 使用算术运算符来计算累加的数。 2. **循环结构**: 使用 `while` 循环来重复累加操作。 3...

    java2实用教程(3版)_耿祥义_习题解答.doc

    if (i % j == 0) sum += j; } if (sum == i) System.out.println("完数:" + i); } ``` **知识点4:无限循环与退出条件** - 使用`while(true)`创建无限循环,并通过内部条件判断实现退出机制。 ```java ...

    算法设计与分析习题答案1-6章 (2).pdf

    sum += i; value /= i; } } return sum == value; } ``` 7. **过桥问题**:四人过桥问题,目标是最小化总时间。通过安排速度最快的人返回送手电筒,可以得到最优解。例如,甲乙先过,甲再回,甲丙过,甲再回...

    C++ 经典算法大全

    sum += j; a[k++] = j; } } t = k; if (sum == i) { cout &lt;&lt; i &lt;&lt; "-&gt;"; for (k = 0; k ; k++) { cout [k]; if (k ) cout ,"; } cout ; } k = 0; } } ``` **核心逻辑:** - 对于每一个数 i,在 1 到...

    c/c++面試精髓題

    最后,我们再来看看`strlen`函数的完美实现(10分): ```cpp int strlen(const char *str) { int len = 0; while(*(str + len) != '\0') { len++; } return len; } ``` 这个版本通过逐个检查字符直到遇到结束...

Global site tag (gtag.js) - Google Analytics