a++ 和 ++a 的区别

a++ 和 ++a 的区别

i++和++i的区别,面对这样的问题,首先会觉得很简单就像1+1等于几一样,可我们往往会大脑短路,会得到错误答案。

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

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

a++ 和 ++a 的区别

       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++这么一件事情!

书到用时方恨少,纸上得来终觉浅。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115062.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 2018阿里巴巴春季校招笔试题(Java开发)「建议收藏」

    2018阿里巴巴春季校招笔试题(Java开发)「建议收藏」第一题:编程题要求:编译器版本:Java1.8.0_66请使用标准输入输出(System.in,System.out);已禁用图形、文件、网络、系统相关的操作,如java.lang.Process,javax.swing.JFrame,Runtime.getRuntime;不要自定义包名称,否则会报错,即不要添加packageanswer之类的语句;您可以写很多个类,但是必须有一个…

  • netty拆包_http粘包

    netty拆包_http粘包Netty粘包/半包原理与拆包实战(史上最全)疯狂创客圈Java聊天程序【亿级流量】实战系列之13【博客园总入口】本文的源码工程:Netty粘包/半包原理与拆包实战源码本实例是《Netty粘包/半包原理与拆包实战》一文的源代码工程。写在前面大家好,我是作者尼恩。为了完成了一个高性能的Java聊天程序,在前面的文章中,尼恩已经再一次的进行了通讯协议的重新…

  • Qml异步加载图片「建议收藏」

    Qml异步加载图片「建议收藏」当图片很大时,加载图片可能导致UI线程的阻塞,为了确保图片在加载过程中不会阻塞UI线程,将Image元素的’asynchronous’设置为trueImage{asynchronous:truesource:"test.png"}…

    2022年10月23日
  • struts2漏洞复现

    struts2漏洞复现struts2漏洞复现简介Struts2是apache项目下的一个web框架,普遍应用于阿里巴巴、京东等互联网、政府、企业门户网站Struts2是一个基于MVC设计思路的Web应用框架,它本质

  • 介绍几种SSIS部署方式

    介绍几种SSIS部署方式

    2021年11月26日
  • 老电脑 升级 cpu性能排行 高性价比的cpu主板选择

    老电脑 升级 cpu性能排行 高性价比的cpu主板选择老电脑升级cpu性能排行高性价比的cpu主板选择4核ddr2ddr3

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号