C语言 恼人的结合性和优先级和副作用

结合性和优先级和副作用

1.优先级

优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是

不⼀样的。

在C语言中,优先性和结合性规则是非常重要的。然而C语言有几乎50中运算符,因此去费心记住不实际,当有疑问的时候我们要通过查表或者使用足够多的圆括号

当然我们应该记得一些常用的优先级,比如后缀自增自减符号优先级最高,前缀自增自减符号和一元正负符号次之,赋值符号优先级最低等等

2.结合性

如果两个或两个以上运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了,则根据运算符

是左结合,还是右结合,决定执⾏顺序。⼤部分运算符是左结合(从左到右执⾏),少数运算符是右

结合(从右到左执⾏),⽐如赋值运算符( = )。
值得大家注意的是往往初学结合性的同学往往会将数学上的知识误入到C语言学习中,如(ab)+(cd)有些会认为加的时候从左向右加。结合性不是如此,此时表达式中只有一个运算符,因此这里并没有结合性

那么教大家一个非常简单区分结合性的方法如"a+b+c",观察表达式有两个运算符优先级相同且都是左结合行的,我们就找到最右边的运算符将该运算符的左边括起来也就是"(a+b)+c",右结合性同理

例子

a*-b/c-b

先找优先级,一元-的优先级最高

a*(-b)/c-b

其次乘除

(a*(-b)/c)-b

然后找结合性乘除都是左结合性的找到最后边的运算符/,将左边的括起来

((a*(-b))/c)-b

结束

尽管编译器能很轻松的识别出优先级和结合性,但是人不行。为了代码的可读性希望大写代码的时候适当加上圆括号

3.副作用

通常不希望运算符修改他们的操作数,因为数学中的运算符就是如此。但当我们使用赋值运算符包括简单赋值和复合赋值,还有自增自减运算符

连续的简单赋值可能会导致数据的丢失。(如果以上错误可以通过统一数据类型解决,那以下程序就是灾难了)

在面对C语言未定义的行为,我们是不是应该不在此引起歧义。我知道大家都是很优秀的程序员通过寥寥几行代码就可以完成复杂的程序,但往往可能代码过分的省略不见得是好事,因此我们将赋值语句拆开来写而不是一起放在一个表达式中

复合赋值介绍
有些同学可能会将v+=e等价于v=v+e,首先是优先级的问题赋值运算符的优先级十分低,因此v/=j+k和v=v/j+k完成不同前者等于v=v/(j+k)

同时在极少数时候由于副作用
(i++)+=j和(i++)=(i++)+j后者进行了两次自增前面只进行了一次自增

下面例子

i=1;

j=i++ + i++;由优先级可得

j=(i++)+(i++)执行完该条语句之后i应该自增了两次,但是这两次自增是同时自增还是其中一个i先自行自增之后然后另一个再自增,两者的差别会导致j值得完全不同

  • 1.j=i+i;i++;i++;
  • 2.j=i(然后i自增了)+(i+1),后者i自增i++

4.简单区分i++,++i,i+=1;i=i+1;i=i++

在没有赋值的情况下,i++等同与++1。如果有赋值的情况下,i++先赋值再自增,++i先自增再赋值
i+=1与++i完全相同都是自增
i=i+1就是简单的操作数加法
i=i++涉及到自增和赋值运算,先赋值i=i,再自增,此时i会被覆盖

以上就是结合性和优先级的内容,希望大家平时写代码的时候多多注意,减少未定义的行为出现

相关推荐
飞Link1 分钟前
LangGraph SDK 全量技术手册:分布式 Agent 集群的远程调用与编排引擎
开发语言·分布式·python·数据挖掘
itzixiao4 分钟前
L1-041 寻找250(10分)
开发语言
沐苏瑶5 分钟前
Java据结构深度解析:AVL 树与红黑树
数据结构·算法
feifeigo1236 分钟前
MATLAB中对转子建立有限元模型并进行动力学计算
算法
njsgcs7 分钟前
获得solidworks 3d零件的包围框 长宽高 boundingbox c#
开发语言·c#·solidworks
老花眼猫7 分钟前
数学艺术图案画-曼陀罗(二)
c语言·经验分享·青少年编程·课程设计
网域小星球7 分钟前
C 语言从 0 入门(十九)|共用体与枚举:自定义类型进阶
c语言·开发语言·算法·枚举·自定义类型·共用体
Evand J9 分钟前
【滤波代码介绍|MATLAB】粒子滤波(PF)与自适应粒子滤波(APF)在三维动态系统状态估计中的对比,使用Sage Husa自适应的思想
开发语言·matlab·pf·粒子滤波·apf·自适应滤波
favour_you___12 分钟前
算法练习2026/4/13
算法·深度优先
zybsjn13 分钟前
异步并发的“流量警察”:在C#中使用SemaphoreSlim进行并发控制的最佳实践
开发语言·c#