如果变量的值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 是一致的)。
Update:事实证明表达式x += x += 1
根据 C 标准,具有未定义的行为(感谢ouah https://stackoverflow.com/users/1119701/ouah, 约翰·博德 https://stackoverflow.com/users/134554/john-bode, DarkDust https://stackoverflow.com/users/400056/darkdust, 德鲁·多尔曼 https://stackoverflow.com/users/16287/drew-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)“在上一个和下一个序列点之间,对象的存储值最多应通过表达式的求值修改一次。”
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)