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

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java进行四舍五入_java 实现四舍五入功能

    java进行四舍五入_java 实现四舍五入功能告诉你一个小技巧,用4行java代码实现一个四舍五入功能的实例。四舍五入是一种精确度的计数保留法,与其他方法本质相同。但特殊之处在于,采用四舍五入,能使被保留部分的与实际值差值不超过最后一位数量级的二分之一,这种保留法的误差总和是最小的。例子例如π,便被四舍五入,大多保留下3.14了。但是,有的时候不可以用四舍五入的方法,而要用”进一法”和”退一法”。例如,288个学生春游,45人一辆大巴,算下来…

    2022年5月21日
    29
  • Centos安装字体

    Centos安装字体

    2021年5月30日
    115
  • 二叉树性质总结

    二叉树性质总结性质1:二叉树第i(i>=1)层上的节点数最多为2^(i-1)证明:归纳基础:第一层有一个节点,第二层最多有两个节点,第三层最多有四个节点,以此类推,数学归纳法证明如下:i=1时,2^(i-1)=2^0=1,因为第一层上为根节点,所以命题成立。归纳假设:假设对所有的j(1归纳步骤:根据归纳假设,第i-1层上至多有2(i-2)个节点,由于二叉树每个节点至多有两个孩子节点,所以第i

    2022年5月6日
    43
  • linux使用docker_docker bash

    linux使用docker_docker bash安装命令sudoaptinstalldocker.io查看安装sudodocker–version添加用户到docker组sudogpasswd-a$USERdocker重启dockersudosystemctlrestartdocker查看状态sudodockerps-a查看镜像sudodockerimages创建容器dockerrun-it–nameubuntu1ubuntudockerrun-…

    2022年9月17日
    5
  • 网吧服务器发消息,网吧盗号常见途径总结以及解决办法

    网吧服务器发消息,网吧盗号常见途径总结以及解决办法近期有部分网吧反馈,网吧随机出现盗号问题,主要反馈现像是:QQ提示账号异常登录和乱发消息等、CF/wegame/吃鸡账号被盗等目前发现盗号问题主要有以下几种途径:一.网吧本地内部环境中毒引起的盗号问题1.服务器中毒处理方法:服务器安装火绒,查杀下C盘和内存,查完杀完毒后把火绒卸载掉以免识杀游戏文件2.服务器被入侵,加入了开机启动项带第三方增值引起处理方法:将启动项先关掉,一项一项加上去测试,直到…

    2022年7月26日
    24
  • 如何写cover letter 翻译自How to write a cover letter

    如何写cover letter 翻译自How to write a cover letter本文是此文章的中文翻译,有根据自己不一定正确的理解进行的改动。如何写coverletter一个好的coverletter是所提交的内容的一个重要组成部分。它并不是一个电子时代过时的古老交流方式,而应该被看作一个向编辑传达论文中的重要信息的机会。所有提交的论文(指本期刊)都要经过editorialevaluation阶段,但尽管我们都是专业的编辑,我们也不可能了解期刊内容所涵盖的每一个领域。因此,提交coverletter不仅能够帮助编辑快速地决定是否秒拒你,也能够帮…

    2022年6月11日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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