首页 > 其他分享 >搞不清++操作符前置后置的区别?看这篇博客就够了!

搞不清++操作符前置后置的区别?看这篇博客就够了!

时间:2024-03-22 22:30:17浏览次数:23  
标签:后置 ++ 前置 就够 操作符 ptr 指针

前言:--操作符与++操作符属性可类比理解,懂++就懂--。

一、++操作符简介

        ++操作符是一种单目操作符,意味着其操作数只有一个,那么由于++操作符位于操作数的位置不同,分为前置++(例:++a)和后置++(例:a++)。++操作符有自增属性,++后会使得自身数值改变,数值+1

二、前置++与后置++的区别

        前置++与后置++在形式上的区别上文已经提到,那么此小节重点讲解逻辑功能上的区别。简单说来就是一句口诀:前置先+1后使用,后置先使用后+1

现在,我们来对前置++与后置++进行逻辑拆解:

1.后置++:

由于是后置++,那么就先将a的值赋给b,在结束此赋值后a再自增1,逻辑上如下图:

2.前置++:

由于是前置++,那么就先将a的值自增1,在结束此自增后将a值赋给b,逻辑上如下图:

三、++操作符的副作用

       辛苦看博客到这里,想必大家已经能分清楚前置++与后置++在形式上和逻辑上的区别了,但是还有一个副作用,这盲点其实指的就是其自增的属性,++操作符的使用会改变原来变量的值,而且每次++特别是后置++,在一些语句中若使用不当(如指针++可能就会造成越界访问)会带来不可预估的效果,这对于程序员来说是危险的。

这里我以模拟实现strncat函数为例:

对于strcat函数不明白的读者请详见strncat - C++ Reference (cplusplus.com)

首先对于dest指针我是想要使用它并且在使用完后将其作为参数返回的,但是由于++的自增属性下,程序执行完它就不再是曾经那个指针了,它所存放的地址已经改变,所以我用ptr指针来代替它完成功能,这样dest指针就保持不变了。

其次是while语句中每次对ptr语句进行解引用,判断,再++,当ptr指向‘ \0’时不再继续循环但还会进行最后一次++,那么此时ptr还是指向‘\0’吗?不是了!这就并非原本的想法,ptr变为野指针了,所以我在while语句后对其进行--,这样ptr才重新指向‘\0’。

所以这样写代码(不加上ptr--),咋一看以为是个大哥这么牛,其实是个bug错错错。还不如改为:

这样一来,可读性得到提高且不容易出错,岂不是更好,装什么大哥啊?!

标签:后置,++,前置,就够,操作符,ptr,指针
From: https://blog.csdn.net/ximiemie0525/article/details/136815877

相关文章

  • [c++/gcc] Centos 7.9升级 gcc 4.8.5 到 gcc11 [转]
    0序本文背景:因在centos7.9server上安装nodejs21.7.1,编译nodejs时,依赖了gnu17/gcc11。例如:遇到Qtrequiresc++11support、-std=gnu++17例如:编译器不支持c++17,就会提示:g++:error:unrecognizedcommandlineoption‘-std=c++17’例如:编译器不支持c++17,就会提示:g++:......
  • 【C++ 08】vector 顺序表的常见基本操作
    文章目录前言......
  • 【C++】string类模拟实现
    个人主页:zxctscl如有转载请先通知文章目录1.前言2.构造函数和析构函数3.遍历3.1下标+[]3.2迭代器4.Modifiers4.1`push_back`和`append`4.2+=4.3insert4.4erase4.5swap5.Capacity5.1resize5.2clear6.深浅拷贝6.1浅拷贝(值拷贝)6.2深拷贝7.String......
  • C++暴力指南
    关于暴力做法暴力,非常直白的就是直接硬做,不管他循环有多大,不管他数据量有多大。你要记住的一个事情就是,暴力只面向小数据,但是必定能得到正确解(前提当然是你没写错)甚至你需要进行对拍的时候你也得先写一个暴力出来才能方便对拍。但是也因此,为了尽可能的偷分,暴力里要做尽可能的比......
  • C++流媒体开源库Live555详细介绍
    C++流媒体开源库Live555详细介绍C语言资深大师  5人赞同了该文章1、Live555简介Live555是一个为流媒体提供解决方案的跨平台的C++开源项目,它使用了RTP/RTCP、RTSP、SIP开放标准协议,实现了标准流媒体传输。Live555实现了对多种音视频编码格式的音视频......
  • C++ 指针,指针引用,二级指针作为实参传入函数体,形参改变指向的问题
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、形参指向变化,实参指向不变二、指针引用传递改变实参指向三、二级指针**传递改变实参指向一、形参指向变化,实参指向不变前提了解:无论是值传递,指针传递,引用传递,形参和实参都是完全不同的......
  • C++中char,char*,char[],string存储中文的问题
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、使用char,char*,char[],string存储中文二、内存中是乱码,但是可以正常输出三、解决方法:w_char,前言学习时遇到的问题,如有不对,欢迎大佬们批评指正!一、使用char,char*,char[],string存......
  • [C++提高编程](一):模板----函数模板
    目录函数模板作用函数模板的语法注意事项普通函数与函数模板的区别普通函数与函数模板的调用规则模板的局限性案例--通用数组选择排序从大到小模板是C++中泛型编程的基础,一个模板就是一个创建类或函数的蓝图或者公式。函数模板作用建立一个通用函数,其函数返回值类型......
  • C++看程序写结果:类继承与类组合,默认与含参的构造先后顺序 易错
    C++类继承与类组合,默认与含参的构造先后顺序 易错这道题原本是没有那么多输出信息的,是我自己加上了调用什么函数的提示。一开始以为就输出两行,一行是构造父类时A:5,一行是构造子类时x=5,A::x=5。#include"bits/stdc++.h"usingnamespacestd;classA{public:A(){......
  • c++的链接器
    C++链接器是一个编译器工具,用于将编译器生成的目标文件(通常是对象文件)链接在一起,以生成可执行文件或共享库。在C++编程中,链接器负责解析函数和变量的引用,并将它们关联到正确的定义位置。链接器的主要任务包括:1.**符号解析**:解析目标文件中使用的函数和变量的符号引用。当编译器......