C++中的自增与自减

目录
  • 1、自增与自减
    • 1.1 基本用法
    • 1.2 进阶理解
    • 1.3 差异
    • 1.4 指针自增、自减

自增与自减是C++当中两个使用频率非常高的运算符,不仅在循环当中用到,在日常的代码当中也经常使用。

1、自增与自减

1.1 基本用法

自增与自减是C++当中两个使用频率非常高的运算符,不仅在循环当中用到,在日常的代码当中也经常使用。

甚至C++这个名称的由来都和自增运算符有关,表示C语言的升级版。当然这也是C#名字的由来,#这个符号表示4个叠加的加号……不得不吐槽这微软的恶趣味。

我们都知道自增有两种写法,一种是i++另外一种是++i。这两种写法对于i这个变量的最终结果来说是一样的,都是自增了1,但是对于自增这个操作的发生时间,则有很大的差异。

比如:

int a = 0, b = 0;
cout << a++ << endl;
cout << ++b << endl;

最终我们得到的输出结果是0和1,差别就在执行自增的时间。对于cout << a++来说,它是先执行cout操作,再执行自增,而cout << ++b则相反,是先执行自增再执行cout

同理,我们在赋值的时候也是一样:

int a = 0, b = 0;
int c = a++;
int d = ++b;

c和d得到的结果同样是一个为0,另外一个为1,原因和刚才一样。

以上的规则同样适用于自减。

1.2 进阶理解

现在我们知道了++i的执行顺序在i++之前,那么问题来了,那么它们两者的执行顺序究竟是怎样的?差异到底在哪里呢?

对此,C++当中有一个叫做顺序点的概念,顺序点指的是程序执行过程中的一个点。在C++当中语句中的分号就是一个顺序点,在程序处理下一条语句之前,赋值运算符、自增、自减运算符执行的所有修改都必须完成。除了分号之外,完整的表达式末尾也是一个顺序点。

完整表达式的概念有点费解,C++ Primer中的定义是不是另一个更大的表达式的子表达式,比如while循环中的检测语句就是一个完整表达式。

比如:

int cnt = 0;
while (cnt++ < 10) cout << cnt << endl;

程序的输出结果是:

我们可以看到它的输出结果从1开始,而并非从0开始。意味着我们在执行cout之前,cnt变量就已经完成了自增。这进一步说明了while(cnt++ < 10)本身就已经是一个完整表达式了。因此在这个表达式执行之前,C++就会完成自增的操作。

关于完整表达式还有一个坑点,就是它的执行顺序。

比如下面这个例子:

y = (4 + x++) * (6 + x++);

由于(4 + x++)(6 + x++)都不是一个完整表达式,因此C++并不能保证x++的执行顺序,它没有规定是在每个子表达式计算之后执行自增,还是整个表达式计算之后再自增。它只能保证在执行到下一条语句之前x变量被自增两次,至于它的执行时间则无法保障。

因此,最好不要写出这样的代码,不仅可读性差,而且结果也可能不可靠。

1.3 差异

我们还有一个问题没有解决,在不影响结果的情况下,前缀的形式和后缀的形式究竟还有没有其他差别呢?

比如:

x++;
++x; 

for (int i = 0; i < n; i++);
for (int i = 0; i < n; ++i);

我们现在知道它们的结果是一样的,但在内部执行是有细微差别的。差别在于后缀的形式会先生成一个拷贝值,再将拷贝值赋值给原值,而前缀的版本是直接在原值上修改。因此理论上来说,前缀版本的效率更高。当然这当中的差别非常细微,几乎可以忽略不计。

但是在面试当中很有可能会被问到,因此有所了解即可。

1.4 指针自增、自减

自增自减操作同样可以运用在指针上,前文当中介绍过,这表示指针的移动。自增表示向右移动一位,自减表示向左移动一位。

这很简单,但是当我们把一些操作符结合在一起就有些麻烦了。C++当中规定,前缀运算符和解引用运算符优先级相同,按照从右到左的方式结合,后缀运算符优先级更高,从左至右。

这意味着*++pt表示先执行指针自增操作,也就是移动一位之后,再解引用。

++*pt则意味着先解引用取得值,再对改值加1。

x=*pt++由于后缀符的优先级更高,意味着先执行指针移动,再解引用。如果大家实在搞不清楚的话,可以使用括号。

到此这篇关于C++中的自增与自减的文章就介绍到这了,更多相关C++自增与自减内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

注:文章转自微信公众号:Coder梁(ID:Coder_LT)

(0)

相关推荐

  • 浅谈C++类型转化(运算符重载函数)和基本运算符重载(自增自减)

    类型转化(运算符重载函数) 用转换构造函数可以将一个指定类型的数据转换为类的对象.但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据).在C++提供类型转换函数(type conversion function)来解决这个问题.类型转换函数的作用是将一个类的对象转换成另一类型的数据. 类型转换函数的一般形式为: operator 类型名( ){ 实现转换的语句 } 下面是简单实现.这时候,Base起了两方面的作用:类和数据类型.系统会在

  • C++ 自增、自减运算符的重载和性能分析小结

    01 ++.--运算符重载函数的格式 自增运算符和自减运算符是有前置和后置之分的,如: a++ // 后置自增运算符 ++a // 前置自增运算符 b-- // 后置自减运算符 --b // 前置自减运算符 为了区分所重载的是前置运算符还是后置运算符,C++规定: 前置运算符作为一元运算符重载,重载为成员函数的格式如下: T & operator++(); // 前置自增运算符的重载函数,函数参数是空 T & operator--(); // 前置自减运算符的重载函数,函数参数是空 后置运

  • C++中的自增与自减

    目录 1.自增与自减 1.1 基本用法 1.2 进阶理解 1.3 差异 1.4 指针自增.自减 自增与自减是C++当中两个使用频率非常高的运算符,不仅在循环当中用到,在日常的代码当中也经常使用. 1.自增与自减 1.1 基本用法 自增与自减是C++当中两个使用频率非常高的运算符,不仅在循环当中用到,在日常的代码当中也经常使用. 甚至C++这个名称的由来都和自增运算符有关,表示C语言的升级版.当然这也是C#名字的由来,#这个符号表示4个叠加的加号--不得不吐槽这微软的恶趣味. 我们都知道自增有两种

  • Java中自增和自减操作符(++/--)的那些事

    自增(++)和自减(--)运算符 在JAVA语言中存在着很多运算符,但是在实际开发中我们或许很少用到它们,在初次学习中却时常出现它们的身影,对于这些运算符的含义和用法,是否还记得呢? 1. 概述 自增操作符(++)和自减操作符(--)是对变量进行加1和减1的操作. 2.分类说明 ++和--是对变量进行自增1和自减1的简写操作符.许多编程任务中经常需要对变量加1或者减1,所以采用这两个操作符会方便许多.例如,下面的代码是对i自增1,而对j自减1: int i = 3, j = 3; i++; //

  • laravel 中某一字段自增、自减的例子

    increment自增方法有两个参数:第一个为必填,代表要对数据表的哪个字段进行自增操作,第二个参数为可选,如果为空则表示每次递增1,如果填写了比如3,则表示每次在原有的基础上递增3. DB操作: DB::table('users')->increment('votes'); DB::table('users')->increment('votes', 5); DB::table('users')->decrement('votes'); DB::table('users')->d

  • node.js Sequelize实现单实例字段或批量自增、自减

    一.单实例自增.自减 在Sequelize中,一个实例(Instance)表示数据库中的一行记录.Instance有两种:由Model.build()创建的非持久化实例,和由Model.create()等方法创建的持久化实例.无论是持久化还是非持久化实例,都会有increment() .decrement()两人上方法,分别用于字段值的自增和自减两种操作. instance.increment(fields, [options]) - 字段值自增 instance.decrement(field

  • PHP 布尔值的自增与自减的实现方法

    在上午和业务需求战斗结束之后,准备打开群看看各位老司机有没有看车,突然看到 @E舞九天 II 发的一些消息 他发现,PHP 的布尔值自增,无论自增多少遍,最后输出的都是 1 这就比较有趣了~ 自增和自减,++$a 和 $a++ 的区别大家都知道 ++a 表示取 a 的地址,增加内存中 a 的值,然后把值放在寄存器中 a++ 表示取 a 的地址,把 a 的值装入寄存器中,然后增加内存中 a 的值 我打开一个编辑器,去确认一下这个结果 $a = true; var_dump(--$a); echo

  • SqlServer 在事务中获得自增ID的实例代码

      SqlServer 在事务中获得自增ID实例代码 在sqlserver 中插入数据时,如何返回自增的主键ID,方式有很多,这里提供一种. 代码如下: USE tempdb go CREATE TABLE table1 ( id INT, employee VARCHAR(32) ) go INSERT INTO table1 VALUES(1, 'one') INSERT INTO table1 VALUES(2, 'two') INSERT INTO table1 VALUES(3, 't

  • 基于jQuery的Spin Button自定义文本框数值自增或自减

    有时候在设计表单时需要对文本框实现数值自增或自减功能,例如默认为1,点击向上按钮键则增加指定步长值,点击向下按钮键则减少指定步长值,使用jQuery插件jQuery Spin Button只需要几行代码就可实现该功能,效果如下图 使用说明 一,需要使用jQuery库文件和jQuery Spin Button库文件(目前版本1.1.1) 素材准备 上下按钮图片,默认路径为:/img/spin/,上下按钮图片命名为:spin-button.png,可进行自定义修改 实例代码 一,包含文件部分 复制代

  • 浅谈JavaScript中数组的增删改查

    数组的增加 •ary.push()   向数组末尾添加元素,返回的是添加后新数组的长度,原有数组改变 •ary.unshift()  向数组开头添加元素,返回的是添加后新数组的长度,原有数组改变 • var ary=[1,2,3,4];   var res=ary.unshift(6);   console.log(res); ---->5 返回的是新数组的长度•ary.splice(n,m,x)从索引n开始删除m个元素,把新增的元素X放在索引n的前面,把删除的元素当成一个新数组返回,原有数组改

  • java中的自增问题介绍

    运行下面这段代码,其结果是什么呢? package com.test; public class Inc { public static void main(String[] args) { Inc inc = new Inc(); int i = 0; inc.fermin(i); i = i++; System.out.println(i); } void fermin(int i) { i++; } } 结果是:0 上述类似代码在C/C++中运行结果是:1,这是为什么呢? 这是因为Java

随机推荐