C 递增运算符优先级

C 递增运算符优先级,c,operators,assignment-operator,post-increment,C,Operators,Assignment Operator,Post Increment,当我说 inta=0; int b=1; a=b++;//a=1,然后b=2 为什么会这样 赋值运算符的优先级低于递增和递减运算符。那为什么会这样呢 如果我说: a=b+1;//a=2 在这种情况下,首先执行+,然后分配值。为什么前者不发生这种情况?这与运算符优先级无关。postfix++操作符只是在内部指定为这样的行为,C116.5.2.4: 结果的值计算在副作用之前排序 更新操作数的存储值 这意味着b++首先被计算为1,该值由表达式的其余部分使用,并且该++保证在这之后发生。您(部分)是

当我说

inta=0;
int b=1;
a=b++;//a=1,然后b=2
为什么会这样

赋值运算符的优先级低于递增和递减运算符。那为什么会这样呢

如果我说:

a=b+1;//a=2

在这种情况下,首先执行
+
,然后分配值。为什么前者不发生这种情况?

这与运算符优先级无关。postfix++操作符只是在内部指定为这样的行为,C116.5.2.4:

结果的值计算在副作用之前排序 更新操作数的存储值

这意味着
b++
首先被计算为1,该值由表达式的其余部分使用,并且该++保证在这之后发生。

您(部分)是正确的。赋值运算符的优先级确实低于后缀运算符。然而,你不正确的地方是后缀操作符的意思

根据C11规范:

后缀++运算符的结果是操作数的值。作为副作用,操作数对象的值会递增(即,将适当类型的值1添加到该对象中)。有关约束、类型和转换以及操作对指针的影响的信息,请参见加法运算符和复合赋值的讨论。结果的值计算在更新操作数存储值的副作用之前排序

规范非常清楚这个操作符的语义。它将解析为操作数的原始值,作为后续的副作用,其值将增加

如果希望在示例中增加
a
b
的值,请使用前缀运算符,该运算符保证在赋值之前增加值。
但是,请记住,在单个表达式中对同一变量同时使用后缀和前缀运算符是未定义的行为。不要那样做

优先权来自语言的语法。它告诉我们如何解释这句话,用粗俗的话来说,你可以把它看作是表达的一个隐含的括号

因此,优先级意味着
a=b++
被视为
a=(b++)
,而不是
(a=b)+
。在这种情况下,其他括号没有用处,但在其他情况下,不同的括号可能有意义,例如与
(a&b)^c
相比,
(a&b)^c

请注意,先行性(和关联性)与运行时的求值顺序以及运算符的含义无关


在您的特定实例中,
++
运算符的意思是给出操作数的值,然后作为post条件,递增该操作数。因此
a
被赋予
b
的值,而
b
则分别递增。

它与优先级无关<代码>++与
+1
不同,非常感谢!非常感谢你!非常感谢你!