为什么 (x += x += 1) 在 C 和 Javascript 中的计算结果不同?

2023-12-25

如果变量的值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(使用前将#替换为@)

为什么 (x += x += 1) 在 C 和 Javascript 中的计算结果不同? 的相关文章

随机推荐

  • 在javascript中获取div位置(顶部)?

    我使用 css 设置了一个 div 的高度top 26px 我在其他地方还有其他 div 我想与该 div 保持一致 我注意到jquery写作 css top 获取我的 css 而不是 div 的 y 坐标 如何使用 javascript
  • Hibernate 不等于示例标准

    Hibernate 有示例标准 例如 Example equal Example create mydbObject 有没有办法反其道而行之 例如 Example notEqual Example createNotEqual mydbOb
  • 如何在 SBT 中刷新更新的 Git 依赖项?

    我已经配置了 SBT 0 11 0 以将 GitHub 项目作为依赖项拉入 按照我的回答这个问题在这里 https stackoverflow com questions 7550376 how can sbt pull dependenc
  • 在AWS CDK中执行代码之前如何等待堆栈完成?

    我正在尝试 AWS CDK 但当我尝试执行依赖于堆栈完成的代码块时 我陷入了困境 这是我当前的代码 class Application extends cdk Construct constructor scope cdk Construc
  • 如何编写一个函数来比较多组布尔(真/假)答案并对其进行排名?

    我已经开始了一个项目 事实证明它比我最初想象的要复杂得多 我正在尝试规划一个基于布尔 真 假 问题和答案的系统 系统上的用户可以回答大量布尔 真 假 问题中的任何问题 并根据他们的答案看到一个显示最相似用户 按相似度顺序排列 的列表 我在谷
  • 静态容器已经有一个与之关联的内核

    部署到 Azure 时出现与 Ninject 相关的错误 The static container already has a kernel associated with it 但在本地运行良好 而且之前它一直在本地和 Azure 上运行
  • Python 中的 Webdriver 屏幕截图

    使用python在windows上使用Selenium Webdriver进行屏幕截图时 屏幕截图直接保存到程序的路径中 有没有办法将 png文件保存到特定目录 Use driver save screenshot path to file
  • 允许用户选择图像的相机或图库

    我想做的事情看起来很简单 但经过几天的搜索 我不太明白 我有一个应用程序 允许用户选择多个 最多 5 个 图像 我正在使用一个ImageView 当用户点击ImageView 我想让他们选择 从图库中选择图像 或 使用相机捕捉图像 我开始使
  • 拉伸div以填充body

    div style height 20px background color red div div style background color black div div style height 20px background col
  • Spark 客户端模式 - YARN 为驱动程序分配容器?

    我在客户端模式下在 YARN 上运行 Spark 因此我希望 YARN 仅为执行器分配容器 然而 从我所看到的来看 似乎还为驱动程序分配了一个容器 并且我没有得到与预期一样多的执行程序 我正在主节点上运行 Spark Submit 参数如下
  • JSTL 表达式语言访问对象属性

    我今天正在学习一个教程 这个教程让我摸不着头脑一个小时 考虑 public class MyClass public int getTotal amount 100 return amount 以及 JSP 的摘录 p Total obje
  • 万智牌数据库设计

    我想为我拥有的 MTG 卡创建一个数据库 设计会是什么样的 我想存储每张卡的以下信息 1 Name of card 2 Set the card belongs to 3 Condition of card 4 Price it sold
  • 位图插值c#

    网格尺寸 160 160 行数 列数 16 16 我为此创建了一个位图 网格的每个单元格都填充有不同的颜色 我需要执行颜色插值 我猜您想要执行以下操作 拍摄 16x16 像素图像并将其插值为 160x160 像素图像 以下是三个示例输出 您
  • 实现WebView数据库配额委托

    我如何实现这个方法 见下文 我是 Objective C 的新手 我只是不太了解它 From http lists apple com archives Webkitsdk dev 2008 Apr msg00027 html http l
  • 确定将在 php 中发送的 http 状态

    我正在尝试为管理应用程序标头的类编写一个测试用例 它发送的标头中有 http 状态标头 我正在使用 headers list 来查看将发送哪些标头 如果我现在发送标头的话 headers list 的问题是它不包含 http 状态标头 尽管
  • 为什么 lapply() 不保留我的 data.table 键?

    我的列表中有一堆 data tables 我要申请unique 到我的列表中的每个 data table 但这样做会破坏我的所有 data table 键 这是一个例子 A lt data table a rep c a b each 3
  • 这两组陈述之间的确切区别是什么?

    Set
  • 如何重新索引 pandas 数据透视表

    我创建了一个数据透视表 该表根据其中一列和时间索引的月份进行分组 这是数据透视表 AWRT AWFT AWDT Time type April All 38 190119 65 789103 27 598984 DHW 19 676627
  • 隐式、显式和流利等待之间的区别

    两者之间的确切区别是什么implicitwait explicitwait and fluentwait 您能举例说明吗 我已经发布关于此的博客文章 https medium com austenjt difference betwen i
  • 为什么 (x += x += 1) 在 C 和 Javascript 中的计算结果不同?

    如果变量的值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 thi