++ 符号

2023-10-27

关于++符号(i +=i++)

刚好最近看到一个关于i=i++的测试题就查询资料测试了一下。

            int i = 10;
            int j = 30;
            i = i++;
            Console.WriteLine(i);
            Console.WriteLine("*******************");

            i = ++i;
            Console.WriteLine(i);
            Console.WriteLine("*******************");

            i = i++ + j;

            Console.WriteLine(i);
            Console.WriteLine(j);
            Console.WriteLine("*******************");
            i = ++i+j++;

            Console.WriteLine(i);
            Console.WriteLine(j);
            Console.WriteLine("*******************");

            Console.ReadKey();

输出如图所示:
项目输出

简单分析一下,++称为自增运算符;之前有学过的是此运算符的变量,后置i++是先参与运算赋值,后进行自加运算,前置++i是先进行自加运算后赋值。

这里所谓的先参与运算赋值,后进行自加运算,是指将其的变量副本进行运算操作,再对其变量本身进行自加操作。后者指的是变量先进行自加运算,再将其变量副本传入操作运算。

以i=i++为例,其基本等价于:

int temp = i;
i++;
return temp;

i=++i来看:

i++;
int temp = i;
return temp;

以此来看 int i=10; i+=i++
其相当于:

int temp = i;
i++;
temp += temp;
return temp;

总的来说,虽然++ 的指令优先级很高,但是其参与运算的是值副本。所以后置的++不影响运算;
那么 int i=10; i=-i++ 也类似于上面所说的,其值为-10;

再引申一点: int p=10; j=p+++p++;
其结果为21;
j=++p+++p;
其结果为23;

那是不是所有编译器都这样呢。
事实时,上述逻辑仅在部分语言(c#,java)中有效,在VC中运行结果和学生时学的一样,最后两个的答案时20和22;这是为什么呢?

一种解释是:“VC/gcc生成的是本地代码,而X86处理器是基于寄存器的架构,也就是如果它要进行了两个数相加,它会先把两个数移到寄存器,再进行加法运算。而Java虚拟机是一种基于栈的架构,如果它要进行两个数相加,它会先弹出两个数,再进行加法运算,再将结果入栈。”等我更深入一些再来评价这种解释。

详见:https://www.cnblogs.com/hustcat/archive/2009/06/02/1494311.html

至此,通过对++符号的理解,更深刻领悟了程序的运行。

(备注)i+++i == (i++)+i,这是由结合方向,贪心法则决定的。

(备注2)关于int* p = &(++q),int* p = &(q++)的问题,.net环境下unsafe后验证均失败;有机会再用其他方式验证,详见: http://blog.csdn.net/zlhy_/article/details/8349300

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

++ 符号 的相关文章

  • vue-router 路由超详细教程

    router 路由详细教程 一 前端路由的概念与原理 1 什么是路由 2 SPA与前端路由 3 什么是前端路由 4 前端路由的工作方式 5 实现简易的前端路由 二 vue router的基本用法 1 什么是 vue router 2 vue
  • 【Bus】编写一个Demo虚拟的总线-设备-驱动模型

    文章目录 1 前言 2 总线驱动模型三要素 2 1 总线 2 2 设备 2 3 驱动 3 Demo Code 3 1 virt bus core c 3 2 virt device c 3 3 virt driver c 问题一 virt
  • BOF——Bag-of-Featrures

    本文主要介绍 BOF Bag of Featrures 的原理及其应用 1 1 引言 文档分类领域有一种模型称为词袋 Bag of words 模型 它是自然语言处理与信息检索过程中的一种简化模型 在这种模型中 文本 段落或文档 被视为忽略
  • Docker之网络:容器通信的模式与技术

    Docker的网络基础 默认网络模式 特殊的几种网络模式 容器和宿主机的通信方式 容器与外部主机的通信方式 文章目录 Docker的网络基础 一 Docker默认的原生网络 bridge桥接 二 host模式 三 none模式 四 Dock
  • 代码审计总结

    目录 概述 一 代码审计 1 1什么是代码审计 1 2为什么要执行代码审核 1 3代码审计的好处 二 代码审计流程 2 1代码检查方法 2 2代码检查项目 2 3编码规范 2 4代码检查规范 2 5缺陷检查表 2 6代码审计复查 2 7代码
  • Linux工具 Ansible

    Linux工具 ansible Ansible是一个运维管理工具 可以减少一些重复的配置 比如有几百台主机需要进行相似的配置时或者对所有主机进行某些软件的版本升级时 如果是人工一台一台的配置是非常慢的 也容易出错 毕竟人精力有限 而这个An
  • PowerShell 美化(谁不想要一个好看的终端呢)

    PowerShell 美化 安装powershell Scoop 安装 Oh My Posh 安装 字体设置 应用主题 花里胡哨的折腾 bushi 多种主题任君挑选 安装powershell 地址 https github com Powe
  • neo4j官方示例数据库

    官方示例数据库 CREATE TheMatrix Movie title The Matrix released 1999 tagline Welcome to the Real World CREATE Keanu Person name
  • param.grad为 None或者TypeError: unsupported operand type(s) for *: ‘float‘ and ‘NoneType‘

    在学习李沐的动手学深度学习 从零开始实现softmax回归中 我跟着敲完代码 发现无法运行 报错入如下 TypeError Traceback most recent call last Cell In 72 line 3 1 num ep
  • 小程序蓝牙传输二维码

    有个需求 蓝牙要显示二维码 需要得到二维码的位图 点阵图 矩阵图 实现思路 1 获得canvas的二维码图片 要求为64px乘64px 2 获得二维码的图片 然后解析像素数组 获得像素的二进制状态码 3 将二进制状态码转化为byte数组 然
  • PCIE专题学习——1.0

    PCIE基础概念 一 1 PCIe的概念 PCIe是一种全双工 差分 端对端 串行告诉接口协议 PCI是并行处理的机制 差分可以提高传输的稳定性 全双工意味着发送端在发送的同时 也可以接收 问题在于串行会比并行处理快吗 当然不一定 这和系统
  • RuntimeError: The Session graph is empty. 和no Attribute““解决方法

    问题产生的原因 无法执行sess run 的原因是tensorflow版本不同导致的 tensorflow版本2 0无法兼容版本1 0 解决办法 添加行 tf compat v1 disable eager execution 无法执行se
  • JAVA 通过POI实现Excel从单元格选择下拉选项

    发生情景 最近使用到了模板导出功能 最开始使用的是hutool的POI工具 但是做下拉列表的时候 addSelect方法报错 问题 Excel在添加自定义下拉数据的时候 输入内容不能大于255个字符 这在做一些简单的下拉选项时没有问题 但是
  • 数论整理之算数基本定理de变形

    D Sigma Function 这道题一看到就和上一道题很像 以为也是算数基本定理的考查 做了一下 发现能过样例 tle tle的思路 经过多次验算 就是发现幂的规律吧 只要存在一个pi ei都为奇数的pi ei 就能使sum为偶数 素因
  • R语言中的quantile()函数

    在R语言中取百分位比用quantile 函数 下面举几个简单的示例 1 求某个百分位比 gt data lt c 1 2 3 4 5 6 7 8 9 10 gt quantile data 0 5 50 5 5 gt quantile da
  • 【ES】原生es的复杂查询

    原生es的复杂查询 相关依赖 复杂查询概述 外层查询 SearchSourceBuilder 类 外层查询概述 对查询结果进行分页 对查询结果进行排序 对查询结果字段进行过滤 对查询结果进行聚合 求年龄的最大值 根据年龄进行分组 内层查询
  • 关于两个页面用params传数据,刷新后数据消失的解决

    通常我们在两个页面传数据时 一般会采用params query 或者将数据用vuex localStorage sessionStorage存储起来 然后方便其他页面调用数据 但是params和vuex有一个不好的地方就是只要我们在接受数据

随机推荐