i++和++i的区别

来源:互联网 发布:矩阵分析 教材 编辑:程序博客网 时间:2024/05/18 16:37

http://blog.csdn.net/david8631/article/details/2707914

如果有表达式 a = i++  它等价于 a = i ; i = i + 1;

       如果有表达式 a = ++i  它等价于   i = i + 1; a = i;

       1 首先两者的区别是:前者是先赋值,然后再自增;后者是先自增,后赋值

       2 ++i和i++都是分两步完成的。因为++i 是后面一步才赋值的,所以它能够当作一个变量进行级联赋值,++i = a =b,即 ++i 是一个左值(可被寻址的值);i++ 的后面一步是自增,不是左值。(2的两步分解与左右值的因果关系只是我的直觉,对错还待考证

       3  ++i 和i++ 的使用,一般来说在循环域里面,这两者并没有什么很大的区别,因为编译器一般都会给你做优化。但是要注意其生存周期,以及很难察觉的写脏,就好像指针delete以后一定要赋予0一样,我们要注意i值在程序流中的变化。

       4  i=1 ; j=(++i)+(++i)+(++i); printf("J=%d/n",j); 这个结果是什么?没有结果,因为不同的编译器做出来的结果,我用vc6和gcc出来的结果是一样的,但是我坚信这么多不同编译器的优化规则都会导致这个怪异的结果。回过头来,这样coding,你会疯掉的,左手logic,右手biology千万别走火入魔!

       5 我们来看看在++行为上表现迥异的c++程序和java程序

test.java

public class test{

          public static void main(String args[]){

                int i = 0 , j ;

                for(j=0;j<5;j++){

                      i=i++; System.out.println("i="+i);

                }

         }

}

test.c

#include<stdio.h>

main(){

  int i = 0 , j ;

  for(j=0;j<5;j++){

     i=i++ ; printf("i=%d/n",i);

  }

}

test.java的结果是 i=0 i=0 i=0 i=0 i=0, test.c的结果是 i=1 i =2 i=3 i=4 i =5

为什么这样呢?其实不必太在乎啦,都是编译器惹的祸,java的编译器对于i = i++,相当于temp = i ; i = i+1 ; i = temp 所以现在我们明白了!而在C的编译机制里面i = i++ ,它只是做了i++这么一件事情!



一直以来,++ --语法浪费了太多人的时间。说句实在话,++ -- 在C语言中其实是一个很细节的语法,除了表达简练外,真的没有什么其它的好处了。由于中国的C语言教程长期以来被谭浩强主宰,而谭又错误的把++ --作为一个C语言重点来教,并增加了一些难点,把本来很简单的语法,搞得复杂无比!简单的来说,++i 和 i++,在单独使用时,就是 i=i+1。而 a = ++i,相当于 i=i+1; a = i;而 a = i++,相当于 a = i; i=i+1;如果实在搞不明白++ --怎么回事,那也不是什么天塌下来的事。因为a=++i完全可以写成 i++; a=i。a=i++完全可以写成 a=i; i++。而且,这也是一种好的程序风格:++ -- 语句如非特殊需要,请单独一行使用。

http://wenda.haosou.com/q/1383227495063306?src=130

0 0