`

i++和++i的区别

阅读更多
如果有表达式 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++这么一件事情!

int i = 0;
int array[] = {1,2,3,4,5};
printf("ths sum is %d",array[i++]);

取到的值是1,第一个元素,然后再i=i+1。

分享到:
评论

相关推荐

    浅谈c i++与java i++的区别

    但是,c语言和java语言在使用increment运算符时存在着一些区别,这篇文章将深入探讨c语言和java语言中i++的区别。 首先,让我们来看一下c语言中的i++。在c语言中,i++是后缀自增运算符,也就是说,它会先返回变量的...

    关于i++和++i以及左值,右值

    由于i++和++i在执行时机和返回值上的区别,它们在实际使用中也有所不同。特别是在赋值操作中,++i的返回值是变量自身,可以直接用于赋值。而i++的返回值是一个临时变量,这个临时变量并不是一个左值,所以不能对其...

    测试i++和++i的区别

    使用++i和i++可以使迭代操作变得容易,但是两者到底区别在哪可以从这个程序中得知,使用java语言编写

    C# i++and++i

    在C#编程语言中,`i++` 和 `++i` 是两种常见的增量运算符,它们都用于将变量的值增加1。然而,虽然这两者看似相似,但在语义上存在细微差别,尤其是在某些特定上下文中。理解这些差异对于编写高效、清晰的代码至关...

    i = i++ 代码分析

    通过对比这三个例子,我们可以看到,i = i++ 代码的执行结果是由赋值语句的顺序和存在性决定的。 最后,让我们总结一下 Java 中的反编译过程。在 Java 中,源代码首先被编译成字节码,然后被解释执行。在反编译过程...

    ++i,i++,--i,i--终结

    #### 二、++i 和 i++ 的区别 **++i (前缀自增)**:这种形式的自增运算符会立即执行加1操作,并返回加1后的结果。例如: ```c++ int i = 1; int j = ++i; // 此时i=2, j=2 ``` **i++ (后缀自增)**:这种形式的自增...

    c++的左值右值 i++与++i的区别.docx

    C++ 中的左值和右值、i++ 与 ++i 的区别 在 C++ 编程语言中,左值(Lvalue)和右值(Rvalue)是两个重要的概念,它们在变量和表达式中的角色不同,理解这两个概念对于编写正确和高效的代码非常重要。 左值(Lvalue...

    ++i和i++d的区别.docx

    i和i ++i和i++的区别

    快速区分一元运算符i++和++i.docx

    在给定的例子中,通过一系列的拆分和分析,我们可以更直观地看到`i++`和`++i`的区别: ```javascript var m = (--i) - (i--) - (i) - (i--) - (i--) ``` 在这个例子中,每一个括号内的表达式都会按照它们的顺序...

    C语言中++i与i++的区别.docx

    在C语言中,`++i` 和 `i++` 是两种常见的自增操作符,它们在编程中的作用是增加变量的值。虽然它们看似相似,但在某些特定情况下,两者的行为是有区别的,这也是C语言初学者经常感到困惑的地方。本文将深入探讨这两...

    while(i++and++i)_helloworld_

    在编程语言中,如C++或...总的来说,这个题目涉及到自增操作符的用法,特别是"i++"和"++i"的区别,以及它们在while循环条件语句中的潜在问题。这不仅是理解C++或类似语言基本语法的关键,也是进行更复杂编程的基础。

    为什么(i++)不能做左值,而(++i)可以

    在C/C++中,后缀递增运算符(i++)和前缀递增运算符(++i)都用于将变量增加1,但它们的操作和结果在某些情况下有本质的区别。前缀递增运算符++i先增加变量的值,然后返回新的值。后缀递增运算符i++先返回变量当前的值,...

    i++和++i的区别.md

    你想要知道i++和i--的区别吗?你想了解i++和++i吗,还有你要了解i--和--i吗?都是可以的,关注我不定时发一些基础知识,这样可以更加的巩固你的知识的,以后的bug可以少写一点。

    Java中i++与++i的区别和使用

    Java中i++与++i的区别和使用 Java 中的 i++ 和 ++i 是两个常用的操作符,它们都是对变量进行加 1 或减 1 的操作,但是它们的执行顺序和结果却有着很大的区别。 首先,让我们来了解一下 i++ 和 ++i 的定义。i++ 是...

    php中++i 与 i++ 的区别

    总结起来,`++i` 和 `i++` 是PHP中的两种自增操作符,它们主要的区别在于操作顺序:`++i` 先增加再赋值,而 `i++` 先赋值再增加。在实际编程中,根据需要选择适当的操作符,以确保代码的清晰性和正确性。了解这些...

    浅析PHP中的i++与++i的区别及效率

    先看看基本区别: i++ :先在i所在的表达式中使用i的当前值,后让i加1 ...再给大家详细说下++i 与 i++ 的区别 1、++i 的用法(以 a=++i ,i=2 为例) 先将 i 值加 1 (也就是 i=i+1 ),然后赋给变量 a (也就

    前置自增 ++i 与后置自增 i++ 的区别及应用

    前置自增 ++i 与后置自增 i++ 的区别及应用

    编程语言中++i与i++运算符的区别及性能分析

    内容概要:本文详细介绍了前置自增(++i)和后置自增(i++)运算符的区别及其应用场景,涵盖C/C++、Java、JavaScript等多门语言。重点讨论了两者在返回值、执行顺序以及在复杂表达式中的差异,并探讨了编译器优化的...

    C++编程教程之自增运算符++i和i++详解

    内容概要:本文通过三个版本的示例代码详细介绍了C++中前缀自增++i和后缀自增i++的区别及其具体应用场景。从初学者友好版本逐渐过渡到可选择自增方式的互动版,再到针对数据结构中使用的进阶版本。通过对每个版本的...

    JS for循环中i++ 和 ++i的区别介绍

    最后,值得一提的是,了解JavaScript中i++和++i的区别,不仅能够帮助开发者在编写for循环时做出更好的选择,同时也能够帮助他们更好地理解其他编程语言(如C++)中的对应概念,因为这些概念在不同的编程语言中可能会...

Global site tag (gtag.js) - Google Analytics