深入理解++和 -- 操作

简介: 深入理解++和 -- 操作

博文内容:

深刻认识C语言的++/--操作

本讲将会教你如何理解前置++,后置++问题

★博文转载请注明出处。

++、--操作

基操:

在这里++和 -- 的执行顺序一致,我们就以++为例

#include <stdio.h>
int main()
{
    int a = 10;
    int b = ++a; //前置++, 先自增在使用
    printf("%d, %d\n", a, b); //11,11
    return 0;
}
#include <stdio.h>
int main()
{
    int a = 10;
    int b = a++; //后置++, 先使用在自增
    printf("%d, %d\n", a, b); //11, 10
    return 0;
}

前置++、-- :都是先自增再使用

后置++、-- :都是先使用再自增

深刻理解 a++

int main()
{
    int a = 0xDD;
    int b = a++; //有b接收,那么a的先使用是将a的值(内容),放到b中
    int c = 0xEE;
    c++; //没有接收方,那么"先使用",如何理解?
return 0;
}

这里的具体理解是需要用到汇编语言的,汇编语言不是本节的重点,我们直接记一下结论:

a++完整的含义是先使用,在自增。如果没有变量接收,那么直接自增

复杂表达式

#include <stdio.h>
int main()
{
    int i = 1;
    int j = (++i)+(++i)+(++i);
    printf("%d\n", j);
    return 0;
}

三个自增符连接起来后构成的表达式,我们可以计算一下这个表达式的结果,然后再把代码复制到编译器中自己运行一下试试看,这个问题是没有正解的,为什么呢?下面我们来分析一下原因。


在vs中,输出结果为12,而在Linux中输出结果就为10


vs是把三个i++全部执行后再把数据拿到寄存器中相加计算,也就是四个4相加


而在linux下的gcc编译器是想把前两个先计算出来,是两个3相加,之后再和后一个(4)相加,为10

总结:

在复杂表达式中,尤其是计算路径不唯一的场景中,由于很多编译器加载进内存中的顺序不同,最后导致计算路径不唯一,计算结果也就不唯一


后记:

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                              ——By 作者:德塔

相关文章
|
Linux 数据安全/隐私保护 Perl
bpf对内核的观测
bpftrace 可以对线上项目的系统调用的函数的进行观测,对观测的结果做出分析
382 0
|
人工智能 安全 API
如何在数字世界复刻一个高还原、高拟真的“你”
通过阿里云智能媒体服务IMS完成数字人形象训练、人声克隆定制,并使用Timeline实现视频合成及创作,打造一个“声形俱佳”的数字分身。
491 0
|
前端开发 JavaScript
HTML+CSS+JS仿京东购物车页面动态效果
HTML+CSS+JS仿京东购物车页面动态效果
354 0
|
Nacos 数据库 Docker
nacos常见问题之docker部署的seata,成功注册到nacos运行报错如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
1505 2
|
JSON 数据格式
分割生成的24位深的彩图转换为8位深的彩图
分割生成的24位深的彩图转换为8位深的彩图
|
网络协议 数据库 数据安全/隐私保护
OSPF基础(二):OSPF区域、router-ID、度量值、修改度量值的方法、OSPF协议报文类型、OSPF邻接关系建立过程
OSPF基础术语讲解、OSPF区域、router-ID、度量值,OSPF度量值的计算方式、修改方式。 OSPF协议报文类型,OSPF三大表项-邻居表,常用的ospf查看方式,邻接关系的建立过程。
OSPF基础(二):OSPF区域、router-ID、度量值、修改度量值的方法、OSPF协议报文类型、OSPF邻接关系建立过程
|
编解码 Linux vr&ar
如何使用ffmpeg将.m4a 格式转换为 pcma格式
ffmpeg是一款开源的万能媒体格式转换工具。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的
|
消息中间件 Cloud Native Apache
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践(1)
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践
207 0
RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践(1)
|
网络协议
计算机网络 | 广播与组播
计算机网络 | 广播与组播
398 0
|
分布式计算 Hadoop 关系型数据库
Sqoop入门指南:安装和配置
Sqoop入门指南:安装和配置