递增++和递减运算符--不论看起来还是用起来,都感觉是十分简单而又优雅的,然而其中却藏有无法受控制的陷阱,我们必须小心的避免错误的用法而出现的不可控的情况发生。

比方说:x = 2* x++ *(3 - ++x);这一语句,假设x=3,该表达式计算后,x的值是什么呢?

你可以这么分析:首先3 - ++x得到- 1,此时x的值为4;

然后2 * 4 * -1=--8; 此时x值为5?

然后x = -8

最终x的值为 - 8?

你在VS2017实现此表达式就会发现,得到的值是-7,为什么不是-8呢?在赋值后才进行了+1操作?

对,在VS2017的实现里,就是在赋值后才把++x的加一操作进行了。

其实在C++中,并没有对x何时才进行加一有硬性的规定(比如没有规定我们之前以为的x++在进行运算后就加一了)

在C++中,只保证了在顺序点前,完成所有的副作用评估,也就是说,只保证了在顺序点前,完成加一这一操作即可,所以在不同的系统上将会有不一样的情况发生,这是我们不可控的。

ps:

副作用:在计算表达式时对某些东西(如存储在变量中的值)进行了修改。

顺序点:程序执行过程中的一个点。(如在C++中,分号就是一个顺序点,任何完整表达式末尾都是一个顺序点。其他更多的顺序点在这里不作过多陈述)

完整表达式:不是另一个更大表达式的字表达式(如表达式语句中的表达式部分已经用作while循环中的检测条件的表达式)

所以终上所述,大家在用递增递减运算符时,请小心避免这一陷阱。

谨慎使用递增/递减运算符(C++)的更多相关文章

  1. PHP中的运算符---位运算符、递增递减运算符、三元运算符、字符串运算符、数组运算符、类型运算符、错误控制运算符

    1.位运算符 位运算符用来对整型数的指定位进行置位,如果被操作数是字符串,则对该字符串的ASCII码值进行操作. 运算类型 运算符 举例 结果 按位与 & $a & $b 将$a 与 ...

  2. C++ Primer笔记12_运算符重载_递增递减运算符_成员訪问运算符

    1.递增递减运算符 C++语言并不要求递增递减运算符必须是类的成员.可是由于他们改变的正好是所操作对象的状态.所以建议设定为成员函数. 对于递增与递减运算符来说,有前置与后置两个版本号,因此.我们应该 ...

  3. JavaScript运算符:递增递减运算符前置和后置的区别

    从两段代码说起 var num1 = 2; var num2 = 20; var num3 = --num1 + num2; var num4 = num1 + num2; console.log(n ...

  4. PHP中的递增/递减运算符

    看这段代码 <?php $a=10; $b=++$a; //此语句等同于 ; $a=$a+1 ; $b=$a echo $a."<br>"; echo $b; ? ...

  5. PHP:第一章——PHP中的算术运算符/递增、递减运算符/赋值运算符

    算术运算符 //$a=10; $b=5; //取反: //echo -$a;//输出:-10: //加法: //echo $a+$b;//输出:15 //减法: //echo $a-$b;//输出:5 ...

  6. PHP 字符串的隐式转换规则以及针对包含字母的字符串的递增/递减操作

    之前一直对 PHP 中关于字符串的算数运算隐式类型转换规则和递增/递减操作符针对字符串的操作比较模糊,今天总结一下. 一.隐式转换 二进制算术运算符的隐式类型转换规则(http://php.net/m ...

  7. C基础知识(3):指针--概念、数组中指针的递增/递减、指针数组&数组指针、指向指针的指针

    指针是一个变量,其值为另一个变量的地址. 所有指针的值的实际数据类型,不管是整型.浮点型.字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数. 下面从4个代码例子分别讲述以下 ...

  8. javascript中的递增递减操作符

    javascript中递增递减属于一元操作符,所谓一元操作符,即只能操作一个值的操作符. 递增和递减操作符各有两个版本:前置型和后置型.顾名思义,前置型应该位于要操作的变量之前,而后置型应该位于要操作 ...

  9. 《挑战30天C++入门极限》对C++递增(增量)运算符重载的思考

        对C++递增(增量)运算符重载的思考 在前面的章节中我们已经接触过递增运算符的重载,那时候我们并没有区分前递增与后递增的差别,在通常情况下我们是分别不出++a与a++的差别的,但的确他们直接是 ...

随机推荐

  1. CJOJ 2485 UVa 11991 生日礼物 / UVa 11991 Easy Problem from Rujia Liu?

    CJOJ 2485 UVa 11991 生日礼物 / UVa 11991 Easy Problem from Rujia Liu? Description (原题来自刘汝佳<训练指南>Pa ...

  2. Android_65535问题的解决

    做过比较大的项目的人都知道,当app大到一定程度的时候,会出现65535这个错误,也就是64K,也就是,一个app包中,方法数不能超过65535个,超过了就要分成多个dex包,这个别问为什么,andr ...

  3. laravel+vue组合的项目中引入ueditor(打包成组件形式)

    前言:最近写东西需要用到ueditor,并且需要是在vue组件中引入. (本博客默认你已经配置了laravel+vue的项目环境,如果还没有配置好的的小伙伴,可以看看我的另一篇博客,链接: http: ...

  4. InnoDB关键特性之change buffer

    一.关于IOT:索引组织表 表在存储的时候按照主键排序进行存储,同时在主键上建立一棵树,这样就形成了一个索引组织表,一个表的存储方式以索引的方式来组织存储的. 所以,MySQL表一定要加上主键,通过主 ...

  5. 【css】盒子模型 之 概述

    摘要 一些基本的概念以及常见使用问题 概述 BFC 是css 中布局的核心 - 盒模型,根据块级元素及行级元素可分为块级容器, 行级容器,但容器内部都遵循 BFC BFC 空间布局 备注: IE 的盒 ...

  6. .net core 项目文件结构浅析

    1:launch.json (配置调试用的) 通过vs code创建的项目,都会有这个文件,是启动调试的配置文件: (vscode默认支持nodejs调试) 要调试调试c#代码  需要安装 C# 插件 ...

  7. 初学Python(十)——列表生成式

    初学Python(十)--列表生成式 初学Python,主要整理一些学习到的知识点,这次是列表生成式. # -*- coding:utf-8 -*- ''''' 列表生成式 ''' #一行代码表达所有 ...

  8. 关于Visual Studio调试 无效指针提示

    前几天遇到了这个问题,编译没问题,直接运行没问题 但是一调试,会提示无效指针,(按Ctrl+F5可以运行,但按F5提示无效指针) 只要这样,新建C:\ProgramData\Microsoft Vis ...

  9. 染色[SDOI2011]

    题目描述 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如"11 ...

  10. jQuery制作淘宝商城商品列表多条件查询功能

    一.介绍 这几天做网站的时候,突然用到这个功能,找了好久也没有找到.看到"希伟素材网"有这么一个JS,效果很不错,也正是我一直以来想要的结果.附图如下: 二:使用教程      1 ...