【发布时间】:2021-05-05 12:40:06
【问题描述】:
我只是想知道,对于以下代码,编译器是否单独使用关联性/优先级或其他一些逻辑来评估。
int i = 0, k = 0;
i = k++;
如果我们根据关联性和优先级进行评估,postfix ++ 的优先级高于=,所以k++(变成1)首先被评估,然后是=,现在k 的值是是1 分配给i。
所以i 和k 的值将是1。但是i is 0 和k is 1 的值。
所以我认为编译器将这个i = k++; 分成两个(i = k; k++;)。所以这里的编译器不是为了语句关联性/优先级,它也分割了行。有人能解释一下编译器是如何解析这些语句的吗?
【问题讨论】:
-
" 所以 k++(变成 1)" --> 不完全。
k变为 1,但其先前的值 0 被“返回”。 -
“所以我认为编译器将这个
i = k++;分成两个i = k ; k++;”。你试过了吗? -
其实不需要在编译器层面解释。该行为由 C 语言规范强制执行。来自规范: 后缀 ++ 运算符的结果是操作数的值。作为副作用,操作数对象的值会递增,然后有关优先顺序的部分指定
++位于=之前,正如您所指出的。 -
与优先级无关。我与运算符返回的值有关。
-
@kaylum,你能告诉我规范的链接吗?那是 C11 (ISO/IEC 9899:2011) 吗?
标签: c operator-precedence assignment-operator post-increment associativity