【问题标题】:Regarding priority of the increment operators关于增量运算符的优先级
【发布时间】:2019-10-17 09:06:15
【问题描述】:

据我所知

int i = 10;
int j = 5;
j += ++i; //j = 16, i = 11 (first i increments and then adds to j)

还有

int i = 10;
int j = 5;
j += i++; //j = 15, i = 11 (first i adds to j and then increments)

在表 5-4(运算符优先级和关联性)中的 C in a nutshell 中,它说后缀运算符 ++ 优先于一元运算符 ++,我不明白,因为相反的是我之前写的.

The table

为什么?

【问题讨论】:

  • 第一个sn-p说先增加i,然后使用它;第二个说首先使用 i 然后递增它。
  • 没错。那是我写的,因为那是我所知道的。但在网站上似乎正好相反。
  • 由于 ++ pre 和 ++ post 没有在同一个表达式中使用,因此无需考虑这些运算符的优先级。
  • 说得好!如果可以的话,哪一个会优先?肯定是前缀? (这不是表中的内容)

标签: c operators


【解决方案1】:

运算符优先级/关联性仅说明 C 代码应解析的顺序。这与代码的执行方式无关1)

意思是如果你有类似*p++的东西,它就等同于*(p++),因为后缀++优先于一元*。但是当稍后执行该代码时,内存位置 *p 将首先被取消引用,然后 p 的地址将增加 1 项。

这又是因为后缀++遵循一条规则,即“结果的值计算在更新操作数的存储值的副作用之前排序”。


1) 想一个数学方程式,例如:a * b + c * d - 数学和 C 中的运算符优先级强制您将其计算为 (a * b) + (c * d),但它并没有告诉您任何关于您是否应该在c * d 之前或之后计算a * b

【讨论】:

  • C 标准并没有说 *(p++) 在递增之前取消引用 p。它表示取消引用中使用的值是增量之前的值。编译器可以获取该值(这会影响“结果的值计算”),递增p(在值计算之后排序),并取消引用先前获取的值(相对于p 的更新不排序)。并且使用volatile 类型,顺序将是可观察的。
猜你喜欢
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 2021-03-08
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多