gpt4 book ai didi

c - 运算符结合性,优先级

转载 作者:行者123 更新时间:2023-12-04 08:10:29 27 4
gpt4 key购买 nike

我只是想知道,对于以下代码,编译器是否单独使用关联性/优先级或其他一些逻辑来评估。

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++做两件事:

  • 它的值为 k在执行任何增量之前。
  • 它递增 k .

  • 这些是分开的:
  • 产生 k 的值作为 i = k++; 主要评估的一部分发生.
  • 递增 k是副作用。它不是主要评估的一部分。程序可能会增加 k 的值在评估表达式的其余部分之后或在它期间。它甚至可以在表达式的其余部分之前增加值,只要它“记住”用于表达式的预增加值。

  • 不涉及优先级和结合性。
    这实际上与优先级或关联性无关。 ++的增量部分运算符始终与表达式的主要计算分开。用于 k++ 的值始终是 k 的值无论是否存在其他运算符,都在增量之前。
    补充
    重要的是要了解 ++ 的增量部分与主要评估分离,并且在时间上有点“ float ”——它没有 anchor 定到代码中的某个位置,你无法控制它何时发生。这很重要,因为如果操作数有其他用途或修改,例如在 k * k++ 中,增量可以发生在其他事件的主要评估之前、期间或之后。发生这种情况时,C 标准不会定义程序的行为。

    关于c - 运算符结合性,优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65990980/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com