gpt4 book ai didi

javascript - 为什么 (x += x += 1) 在 C 和 Javascript 中的计算方式不同?

转载 作者:太空狗 更新时间:2023-10-29 16:23:35 26 4
gpt4 key购买 nike

如果变量 x 的值最初为 0,则表达式 x += x += 1 在 C 中的计算结果为 2,在 Javascript 中为 1。

C 的语义对我来说似乎很明显:x += x += 1 被解释为 x += (x += 1) 反过来, 相当于

x += 1
x += x // where x is 1 at this point

Javascript 解释背后的逻辑是什么?什么规范强制执行这种行为? (顺便说一下,这里 Java 与 Javascript 是一致的)。

更新:事实证明,根据 C 标准,表达式 x += x += 1 具有未定义的行为(感谢 ouahJohn BodeDarkDustDrew Dormann ),这似乎破坏了一些读者的问题的全部要点。通过向其中插入恒等函数,可以使表达式符合标准,如下所示:x += id(x += 1)。可以对 Javascript 代码进行相同的修改,问题仍然如前所述。假设大多数读者都能理解“不符合标准”表述背后的要点,我会保留它,因为它更简洁。

更新 2: 事实证明,根据 C99,身份函数的引入可能无法解决歧义。在这种情况下,亲爱的读者,请将原始问题视为与 C++ 而不是 C99 有关,其中“+=”现在很可能安全地被视为具有唯一定义的操作序列的可重载运算符。也就是说,x += x += 1 现在等同于 operator+=(x, operator+=(x, 1))。很抱歉要走漫长的标准合规之路。

最佳答案

x += x += 1; 在 C 中是未定义的行为。

表达式语句违反了序列点规则。

(C99, 6.5p2) "Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression."

关于javascript - 为什么 (x += x += 1) 在 C 和 Javascript 中的计算方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8979784/

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