如何证明具有优先级表的C后缀增量运算符?

use*_*245 2 c increment operator-precedence postfix-operator

我正在使用C运算符优先级表来更好地理解C的运算符优先级.我在理解以下代码的结果时遇到问题.

int a, b;
a = 1;
b = a++;   // does not seem to follow C operator precedence
Run Code Online (Sandbox Code Playgroud)

使用C运算符的优先级表,我无法解释为什么使用postfix ++运算符,首先计算赋值,然后计算增量.

后缀增量运算符(++)在C中具有最高优先级,赋值运算符(=)具有最低优先级.所以在上面的代码中,第一个postfix ++必须执行然后赋值=.为此两个变量ab应等于2,但他们没有.

为什么C运算符优先级似乎不适用于此代码?

postfix ++的最高优先级何时显示?

dbu*_*ush 5

这与优先权无关.这是后缀++运算符如何工作的问题.

后缀++运算符求值为其操作数的当前值,具有递增其操作数的副作用.相反,前缀++运算符计算其操作数的递增值.

int a, b;
a = 1;
b = a++;   // b is 1, a is 2
b = ++a;   // b is 3, a is 3
Run Code Online (Sandbox Code Playgroud)

后缀++运算符的这种行为记录在C标准的 6.5.2.4p2节中:

后缀++运算符的结果 是操作数的值.作为副作用,操作数对象的值递增(即,将相应类型的值1添加到其中). 有关约束,类型和转换以及操作对指针的影响的信息,请参阅加法运算符和复合赋值的讨论.在更新操作数的存储值的副作用之前,对结果的值计算进行排序.对于不确定顺序的函数调用,后缀的操作 ++是单个评估.++具有原子类型的对象上的Postfix 是具有memory_order_seq_cst内存顺序语义的读取 - 修改 - 写入操作.

前缀++运算符在6.5.3.1p2节中介绍:

前缀++运算符的操作数的值 递增. 结果是增量后操作数的新值. 表达式 ++E相当于(E+=1).有关约束,类型,副作用和转换以及操作对指针的影响的信息,请参阅加法运算符和复合赋值的讨论.


Joh*_*ode 5

优先级确定在解析期间哪些运算符与哪些操作数分组。它控制评估顺序。++具有比 only 更高的优先级=意味着被b = a++解析为b = (a++)而不是(b = a)++

运算++符(一元和后缀形式)都有一个结果和一个副作用。在表达式 中b = a++,的结果a++是 的当前值a- 这就是分配给 的值b的副作用a++给 加上1 a

分配b和更新a发生的顺序未指定。最直接的就是

b <- a
a <- a + 1
Run Code Online (Sandbox Code Playgroud)

但以下情况也是允许的:

tmp <- a
a <- a + 1
b <- tmp
Run Code Online (Sandbox Code Playgroud)

的结果++a是当前值a加1,副作用是加1 a不要假设在类似的表达式之前b = ++aa更新b。同样,评估的顺序可能类似于

b <- a + 1
a <- a + 1
Run Code Online (Sandbox Code Playgroud)

实际的评估顺序取决于您的编译器、优化设置,甚至周围的代码。

强制从左到右计算表达式的唯一运算符是&&||?:和逗号运算符。