# 深入解析C/C++中的关键运算符:i++, ++i, a=i++, a=++i 及复杂表达式的运算顺序

原因

  • 有没有人跟我一样,根本记不住那么多的运算符优先级,凭感觉猜的运算
    顺序,导致代码出错,调试半天,最后发现是优先级的问题
  • 有没有跟我一样,看到复杂表达式就头大
  • 看到一些复杂的表达式,不知道怎么去分析,只能硬着头皮去写,然后运行看结果,有时候还不懂为啥是那样运行的
  • 痛定思痛,决定写一篇博客,总结一下,以后再遇到复杂的表达式,可以更新上去,参考这篇博客,加深理解

前言

在C/C++编程中,运算符的优先级和结合性是理解复杂表达式运算顺序的关键。本文将深入探讨i++++ia=i++a=++i这四个关键运算符的运算顺序,并分析它们在不同情况下的行为。如果绝对对您有所帮助,请可以点个关注收藏一下,谢谢!
墨小羽ovo

1.运算符优先级和结和性

1.1 算数运算符

  • +-*/%:算术运算符,按照从左到右的顺序进行运算。
  • ++--:自增和自减运算符,按照从右到左的顺序进行运算。

1.2 赋值运算符

  • =:赋值运算符,按照从右到左的顺序进行运算。

1.3 关系运算符

  • ==!=<><=>=:关系运算符,按照从左到右的顺序进行运算。

1.4 逻辑运算符

  • &&||:逻辑运算符,按照从左到右的顺序进行运算。

1.5 位运算符

  • &|^~<<>>:位运算符,按照从左到右的顺序进行运算。
    示例程序:
#include <stdio.h>
int main() {int a = 1, b = 2, c = 3;int d = a + b<<1printf("d = %d\n", d); // 输出:d = 5return 0;
}

输出结果:

d = 6

注意 可能好多人以为等于5,我也这样以为哩,看了好久没想明白

  • <<运算符的优先级低于+运算符,所以先进行+运算,再进行<<运算。
  • 运算顺序:先算a+b,再算<<1,最后赋值给d。

1.6 条件运算符(三元运算符)

  • ?::条件运算符,按照从右到左的顺序进行运算。
    示例:
int a = 1, b = 2, c = 3;
int d = a > b ? a : b; // 等价于 int d = (a > b) ? a : b;
`d = 2`

1.7 指针运算符

  • *&:指针运算符,按照从右到左的顺序进行运算。

1.8 sizeof运算符

  • sizeof:sizeof运算符,按照从右到左的顺序进行运算。

结合方向

  • 从右到左:双目运算符中的赋值运算符 单目运算符,三目运算符
  • 从左到右:算数运算符,关系运算符,逻辑运算符,位运算符
  • 优先级:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符

运算符结合的优先级表

参考这位大佬的博客,很详细

运算符结合优先级表

2. i++++i

  • i++:后置递增运算符,先返回i的当前值,然后将i的值增加1。
  • ++i:前置递增运算符,先将i的值增加1,然后返回增加后的值。

示例程序

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

3. a=i++a=++i

  • a=i++:先将i的当前值赋给a,然后将i的值增加1。
  • a=++i:先将i的值增加1,然后将增加后的值赋给a
    示例程序
#include <stdio.h>int main() {int i = 0;int a = i++;printf("i = %d, a = %d\n", i, a); // 输出:i = 1, a = 0i = 0;a = ++i;printf("i = %d, a = %d\n", i, a); // 输出:i = 1, a = 1return 0;
}

4.*(pDataByte++)*pDataByte++区别

  • *(pDataByte++):先解引用pDataByte指向的地址,然后将pDataByte的值增加1。
  • *pDataByte++:先将pDataByte的值增加1,然后解引用增加后的地址。
    示例程序
#include <stdio.h>int main() {int data[] = {1, 2, 3};int *pDataByte = data;# if 1// int a = *(pDataByte++);printf("a = %d\n",*(pDataByte++)); // 输出:a = 1#else//int b = *pDataByte++;printf("b = %d\n", *pDataByte++); // 输出:b = 1#endifreturn 0;
}

运行结果:

a = 1 b = 1

5.USART_RX_BUF[USART_RX_LEN++]=Res;

  • USART_RX_BUF[USART_RX_LEN++]=Res:先将Res的值赋给USART_RX_BUF[USART_RX_LEN],然后将USART_RX_LEN的值增加1。
    示例程序
#include <stdio.h>int main() {char USART_RX_BUF[10] = {0};int USART_RX_LEN = 0;char Res = 'A';USART_RX_BUF[USART_RX_LEN++] = Res;printf("USART_RX_BUF[%d] = %c\n", USART_RX_LEN - 1, USART_RX_BUF[USART_RX_LEN - 1]); // 输出:USART_RX_BUF[0] = Areturn 0;
}

输出结果:

USART_RX_BUF[0] = A

a+++b

  • a+++b:先返回a的当前值,然后将a的值增加1,最后返回b的值。
  • 执行顺序:先执行a++,所以a等于0,在执行a+b再执行b,最后返回a的当前值。

示例程序

#include <stdio.h>int main() {int a = 0;int b = 1;int c = a+++b;printf("a = %d, b = %d, c = %d\n", a, b, c); // 输出:a = 1, b = 1, c = 1return 0;
}

输出结果:

a = 1, b = 1, c = 1

a++,(a++) (*a)++ *++a,

  • a++和(a++)都返回a原来指向的值,并将a指向下一个内存位置。
  • (*a)++返回a指向的值,并将该值增加1,但不影响a的指向。
  • *++a先将a指向下一个内存位置,然后返回新位置的值。

示例程序

#include <stdio.h>int main() {int data[] ={ 1, 4, 7 };int *a = data;//printf("%d\n", *a++); // 输出:1// printf("%d\n", *(a++)); // 输出:1// printf("%d\n", (*a)++); // 输出:1// printf("%d\n", *++a); // 输出:4printf("%d\n", ++*a); // 输出:2return 0;
}

参考资料

运算符结合优先级表
C语言基础知识:操作符详解(附操作符优先级及结合性一览表

总结

这篇博客,主要介绍了C语言中的运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符、指针运算符、sizeof运算符,以及一些复杂运算符的使用示例。后续遇到了,会继续补充。最后呢,在编写博客的过程中,我尽量保持内容的准确性和完整性,但也难免会有疏漏或错误之处。欢迎各位读者指出其中的问题,帮助我不断进步。谢谢大家的阅读,祝大家学习愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/868514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SCI三区|儿童学习优化算法KLO:基于社会进化和认知学习的优化算法

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;ST Javed受到社会环境下家庭儿童的早期社会学习行为启发&#xff0c;提出了儿童学习优化算法&#xff08;Kids Learning Optimizer, KLO&#xff09;。 2.算法原理 2.…

珍藏多年的计算机内核结构大全笔记,掌握计算机工作原理真不难

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

江洲的《家书》,岂止抵万金

题记 今晨6点钟&#xff0c;像往日一样的背上鱼具包&#xff0c;欲驾乘清凉舒适的晨风&#xff0c;前往味江河堤享受钓翁乐趣。孰料开门一看&#xff0c;朦胧的天空竟下着淅淅沥沥的小雨。 今年的天气异常&#xff0c;是笔者寄居“西川第一天”古镇5年来所未见&#xff1a;再…

顺序表实现

size属于结构体的作用域 如果要访问一个结构体的指针用-> 如果要访问一个结构体的变量用. 点操作 #include<stdio.h> #include<stdlib.h> #include<string.h> #include"seqlist.h" //typedef struct seqList{ // SLDataType* _data; //需…

CSS技巧 - 一日一例 (1):会讨好的热情按钮

题外话: 从今天开始,我准备开设一个新的专栏,专门写 使用CSS实现各种酷炫按钮的方法,本专栏目前准备写40篇左右,大概会完成如下按钮效果: 今天,我来介绍第一个按钮的实现方法:会讨好的热情按钮。为什么我给它起这样的名字呢?你看它像不像一个不停摇尾巴的小黄?当你鼠…

29 H3C SecPath F1000 系统(概述)

29 H3C SecPath F1000 系统 系统全局功能&#xff08;高可靠性 日志设置 报表设置 会话设置 升级中心 Lcense配置 高级虚拟化 管理员 维护 诊断中心 配置指导&#xff09; 高可靠性 1 vrrp VRRP将局域网内的可以承担网关功能的一组设备划分在一起&#xff0c;组成一个备份组…

【Spring Boot】Spring AOP动态代理,以及静态代理

目录 Spring AOP代理一. 代理的概念二. 静态代理三. JDK代理3.1 重写 invoke 方法进⾏功能增强3.2 通过Proxy类随机生成代理对象 四. CGLIB代理4.1 自定义类来重写intercept方法4.2 通过Enhancer类的create方法来创建代理类 五. AOP源码剖析 总结(重中之重&#xff0c;精华) Sp…

git使用总结

git介绍 Git是一款免费、开源的分布式版本控制系统 &#xff0c;用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 git安装 下载地址 # 推荐使用国内镜像下载 http://npm.taobao.org/mirro…

解决win10报“无法加载文件……profile.ps1,因为在此系统上禁止运行脚本”的问题

打开命令行报错 解决方法 使用管理员权限打开PowerShell&#xff1a;WinX, 选择“Windows PowerShell&#xff08;管理员&#xff09;” 输入&#xff1a;Set-ExecutionPolicy -ExecutionPolicy RemoteSigned 输入&#xff1a;y确认修改安全策略 &#xff1a;y确认修改安全策略…

前端学习(三)CSS介绍及选择符

##最近在忙期末考试&#xff0c;因此前端笔记的梳理并未及时更新。在学习语言过程中&#xff0c;笔记的梳理对于知识的加深very vital.因此坚持在明天学习新知识前将笔记梳理完整。 主要内容&#xff1a;CSS介绍及选择符 最后更新时间&#xff1a;2024/7/4 目录 内容&#x…

强化学习的数学原理:值函数近似

在上次课介绍了 TD Learning&#xff0c;实际上这次课依然是介绍 TD &#xff0c;但是上次是用的表格形式介绍的&#xff0c;这次课我们将会介绍基于函数的方式。 算法其实不太难&#xff0c;难的是思路和想法&#xff0c;另外这一节将引入神经网络。 另外最经典的 Deep Q-le…

AutoDL部署半自动大模型标注工具踩坑实录

效果演示 克隆代码 git clone http://github.com/yoletPig/Annotation-with-SAM.git安装SAM cd segment-anything pip install -e .安装SAM-Tool依赖包 pip install -r requirements.txt下载权重 wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_

论文新思路!双通道卷积神经网络!最新成果准确率近100%

双通道CNN是一种创新的卷积神经网络架构&#xff0c;它能捕捉到比单通道CNN更丰富的信息&#xff0c;从而提高模型的性能和鲁棒性。 具体点讲&#xff0c;传统CNN采用单个卷积层提取特征&#xff0c;形成特征映射&#xff1b;而双通道CNN则通过两个并行卷积层同时处理输入数据…

越来越多用户和商家选择小程序商城的原因是什么?小程序商城怎么搭建?

得益于小程序的便捷性&#xff0c;越来越多的用户选择在小程序商城购物&#xff0c;越来越多的商家也开始搭建自己的小程序商城。背后原因是什么呢&#xff1f;小程序商城怎么搭建&#xff1f; 用户为何青睐小程序商城&#xff1f; 1、便捷性 小程序商城无需下载安装&#xff…

数据结构——二叉树之c语言实现堆与堆排序

目录 前言&#xff1a; 1.二叉树的概念及结构 1.1 特殊的二叉树 1.2 二叉树的存储结构 1.顺序存储 2.链式存储 2. 二叉树的顺序结构及实现 2.1 堆的概念 ​编辑 2.2 堆的创建 3.堆的实现 3.1 堆的初始化和销毁 初始化&#xff1a; 销毁&#xff1a; 插入&…

开源屏幕分享项目:轻量好用无延迟!!【送源码】

想必大家在日常的工作中&#xff0c;会经常需要分享代码、演示项目或者进行在线教学&#xff0c;这就需要一个既高效又便捷的屏幕共享工具。然而&#xff0c;现有的一些解决方案往往存在延迟高、画质差等问题。 今天就分享一个开源的屏幕共享项目 - screego&#xff0c;不但免…

PHP灵活用工任务小灵通微信小程序系统源码

&#x1f4bc;灵活赚钱新风尚&#xff01;灵活用工任务小灵通微信小程序&#xff0c;兼职自由两不误&#x1f680; &#x1f50d; 一、海量任务&#xff0c;随时随地接单赚外快 还在为找不到合适的兼职而烦恼吗&#xff1f;&#x1f914; 灵活用工任务小灵通微信小程序&#…

Java-Sql注入以及如何解决

sql脚本注入: 如果sql语句使用字符串拼接&#xff0c;可能会出现字符串的拼接&#xff0c;导致sql注入。 #是会先进行预编译&#xff0c;传进来的参数通过占位符填入到已经完成编译的语句中去。

paddleocr运行报错?谈谈解决思路。

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

代码随想录算法训练营第四十七天|1143.最长公共子序列、 1035.不相交的线、53. 最大子序和、392.判断子序列

1143.最长公共子序列 题目链接&#xff1a;1143.最长公共子序列 文档讲解&#xff1a;代码随想录 状态&#xff1a;一开始没想明白为啥要 max(dp[i - 1][j], dp[i][j - 1]) 思路&#xff1a; 如果text1[i - 1] 与 text2[j - 1]相同&#xff0c;那么找到了一个公共元素&#xff…