操作符不是有标准的优先级顺序吗?怎么还会出现表达式副作用的情况?

ultron000 2018-03-10 09:48:20
C++有18个级别的优先级顺序,遇到具体的问题的时候严格按照这个顺序来运算就行了啊,为什么还会有那么多的表达式副作用?

...全文
315 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zilaishuichina 2018-03-12
  • 打赏
  • 举报
回复
传统意义上讲,表达式的作用应该单纯的就是进行计算的,一个表达式,除了产生一个计算结果,不应该改变参与计算的任何变量的值,或者产生其它的效果,这才是一个没有副作用的表达式。 C++中的运算符分两种:无副作用的运算符和有副作用的运算符。有副作用的运算符包括: 赋值(=),复合赋值(+=,*=,/=,等等这种),前增1,前减1,后增1,后减1,如果一个表达式中使用了具有副作用的运算符, 该表达式就是有副作用的表达式。 跟运算符优先级无关。 举个更直观的例子 int a = 1; int b = a++ - a; 按照运算符优先级的规定,++ 大于 -,且-的结合方向是从左往右, 理论上: 第一步,算减号左边的 a++ 第二步,算减号右边的 a 第三步,算 (第一步的运算结果) - (第二步的运算结果) 既不违反运算符优先级,也不违反运算符结合顺序 现在请你告诉我, 第一步的a++,这个后增1,a变成2,到底应该在第一步结束就变成2,还是在第二步结束变成2,还是在第三步结束变成2
赵4老师 2018-03-12
  • 打赏
  • 举报
回复
suuare 2018-03-11
  • 打赏
  • 举报
回复
所谓“先加后用”,c语言没有规定这个"先"到什么时候,同理“先用后加”这个“先”也有同样的问题。故各编译器设计者就按照自己的理解做了。
晨星 2018-03-10
  • 打赏
  • 举报
回复
同意楼上。 而且优先级(包括结合性)跟求值次序并不是一回事。 优先级和结全性决定表达式的静态结构,也就是编译器如何理解这个表达式;而求值次序依赖于编译器理解这个表达式之后所生成的实际代码,在不违反优先级和结合性的前提下,编译器仍有一定的发挥空间。
mstlq 2018-03-10
  • 打赏
  • 举报
回复
别的不提,就拿a+b举例,这里只有一个运算符,没有操作符优先级问题了吧? 实际上编译器会怎么干呢? 1.先把a的值放寄存器,再把b的值放到另一个寄存器,最后执行两者相加 2.先把b的值放寄存器,再把a的值放到另一个寄存器,最后执行两者相加 两种做法都符合标准的…… 但实现上就是不一样。。。。 请楼主先放空头脑,不带成见地再读两遍你贴出来的教材试试?

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧