增量逻辑

2023-11-23

我试图更深入地了解后增量和预增量,但我有点坚持以下表达式:

public static void main(String[] args) {
    int i = 0;
    i = i+=(++i + (i+=2 + --i) - ++i);
    // i = 0 + (++i + (i+=2 + --i) - ++i);
    // i = 0 + (1   + (3    +   2) -  1 );
    // i = 0 + (6                  -  1 );
    System.out.println(i); // Prints 0 instead of 5
}

我知道我在某个地方缺少逻辑,但在哪里?

我尝试过的:

  • 从左到右(虽然我知道不推荐)
  • 从最里面的括号开始,从那里开始。

谢谢您的帮助

PS:评论是我的演算细节

EDIT 1

我尝试更改表达式中的硬编码值2到别的东西,结果总是给出0

看这个例子:

    int i = 0;
    i = i+=(++i + (i+=32500 + --i) - ++i);
    System.out.println(i); // Prints 0

从逻辑上讲,这个表达式应该相差甚远0但不知何故它确实打印了它。

当我使用否定时也会发生同样的情况:

    int i = 0;
    i = i+=(++i + (i+=(-32650) + --i) - ++i);
    System.out.println(i); // Prints 0

EDIT 2

现在,我改变了i首先:

    int i = 1;
    i = i+=(++i + (i+=2 + --i) - ++i);
    System.out.println(i); // Prints 2
    
    i = 2;
    i = i+=(++i + (i+=10000 + --i) - ++i);
    System.out.println(i); // Prints 4
    
    i = 3;
    i = i+=(++i + (i+=(-32650) + --i) - ++i);
    System.out.println(i); // Prints 6

它给出了两倍i每次,无论硬编码值是什么。


Quoting Java 语言规范,15.7 评估顺序:

Java 编程语言保证运算符的操作数似乎按特定的求值顺序求值,即从左到右.

The 左操作数二元运算符的看起来是全面评估在评估右侧操作数的任何部分之前。

如果操作员是复合赋值运算符 (§15.26.2),那么左侧操作数的求值包括记住左侧操作数表示的变量和获取并保存该变量的值用于隐含的二元运算。

所以,本质上,i += ++i会记住旧值i在左侧,before评估右侧。

记住,评估顺序操作数和优先级运算符是两个不同的东西。

逐步显示评估顺序,并在{大括号}中保存值:

int i = 0;
i    = i    += (++i + (i    += 2 + --i) - ++i); // i = 0
i{0} = i    += (++i + (i    += 2 + --i) - ++i); // i = 0
i{0} = i{0} += (++i + (i    += 2 + --i) - ++i); // i = 0
i{0} = i{0} += (1   + (i    += 2 + --i) - ++i); // i = 1
i{0} = i{0} += (1   + (i{1} += 2 + --i) - ++i); // i = 1
i{0} = i{0} += (1   + (i{1} += 2 + 0  ) - ++i); // i = 0
i{0} = i{0} += (1   + (i{1} += 2      ) - ++i); // i = 0
i{0} = i{0} += (1   + 3                 - ++i); // i = 3
i{0} = i{0} += (4                       - ++i); // i = 3
i{0} = i{0} += (4                       - 4  ); // i = 4
i{0} = i{0} += 0                              ; // i = 4
i{0} = 0                                      ; // i = 0
0                                             ; // i = 0

问题编辑的后续行动

如果我们命名初始值I和常数N:

int i = I;
i = i += (++i + (i += N + --i) - ++i);

然后我们可以看到这些值是:

i{I} = i{I} += ((I+1) + (i{I+1} += N + I) - ((I+1+N+I)+1));
i{I} = i{I} += (I + 1 + (I + 1 + N + I) - (I + 1 + N + I + 1));
i{I} = i{I} += (I + 1 + I + 1 + N + I - I - 1 - N - I - 1);
i{I} = i{I} += I;
i{I} = I + I;
i = 2 * I;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

增量逻辑 的相关文章

随机推荐

  • R 和面向对象编程

    在 R 中 以一种或另一种方式进行面向对象编程是非常可能的 但是 与 Python 等不同 有很多方法可以实现面向对象 The R oo包 S3和S4班 参考课 the 原型包 我的问题是 What majorR 中 OO 编程的这些方式有
  • 与发布后的实际下载大小相比,testflight 应用程序大小是否膨胀很大?

    我用 Unity 构建了一个 iOS 游戏 我将其上传到 App Store 启用了位码 IPA 约为 200 mb 在 iTunes Connect 上 它显示我的构建尺寸约为每个设备 30mb 我很高兴看到 但是当我将构建添加到 Tes
  • 如何在asp.net c#中将日期字符串“dd/MM/yyyy”格式转换为“MM/dd/yyyy”?

    我想在 C 中将字符串日期格式 dd MM yyyy 转换为 MM dd yyyy 例子 string d 25 02 2012 i want to convert into 02 25 2012 您可以将其解析为DateTime对象使用D
  • 方法签名中的 Final 关键字[重复]

    这个问题在这里已经有答案了 可能的重复 接口方法中的最终参数 有什么意义 在尝试尝试一些事情时 我遇到了其中描述的问题这一页 interface B public int something final int a abstract cla
  • 如何恢复之前显示的Fragment?

    我在我的项目中使用兼容性包 v4 但在保留Fragment从视图中删除后周围 我有我的Activity显示 2 个片段 左侧是菜单框架 右侧是内容窗格 菜单框架有 3 个可以显示的不同菜单 片段 这就是我替换菜单片段的方式 public v
  • R Shiny:如何将数据表添加到动态创建的选项卡

    我目前正在尝试创建动态创建的数据表 每个数据表都有自己的选项卡 选项卡的数量由用户确定 我已经使用了来自的代码这个帖子作为一个框架 我能够动态创建选项卡 但我不知道如何将数据表添加到选项卡 数据表也由用户输入确定 因此 例如 在 ui R
  • 具有验证功能的独特 CD-KEY 生成算法

    我正在尝试创建一个独特的 CD KEY 放入我们产品的包装盒中 就像用户用来注册产品的标准软件盒中的普通 CD KEY 一样 然而 我们不销售软件 我们销售的是用于犯罪和医疗目的的 DNA 采集套件 用户将通过邮件收到带有 CD KEY 的
  • Angular.js 中哪些“东西”可以注入到其他东西中?

    我很难理解 Angular 中的依赖注入 所以我的问题是 谁能解释一下我们可以将哪些 类型 如控制器 工厂 提供者等 注入到其他类型中 包括相同 类型 的其他实例 我真正要找的是这张表 上面写满了 y n 对于具有相同行 列的单元格 这意味
  • 与组件相比,使用服务有哪些优点和缺点?

    在过去的几个月里 我一直致力于最新的 net 框架中的项目 我觉得在最新的 net 版本中 鼓励 服务 而不是组件 那是对的吗 我在silver light中看到过 我是silver light的初学者 所有的DB层操作都暴露为服务 不知道
  • 如何在Spring的CAS服务属性中正确设置服务URL

    当使用 Spring Security CAS 时 我总是遇到发送到 CAS 的回调 URL 即服务属性 的小障碍 我看过很多例子 例如this and this但它们都使用硬编码的 URL 甚至Spring 的 CAS 文档 典型的剪辑看
  • 我如何创建一个每次在 tkinter 中显示帧时运行的方法

    我有一个 GUI 应用程序 有几个窗口和按钮可以前进和后退 为此 我使用控制器并在每次窗口更改时将框架提升到顶部 这是我的控制器代码和典型框架 import Tkinter as tk python from tkFileDialog im
  • Django OperationalError:无法为连接创建新进程

    今天早上 在让 Django storages Boto 和 Django compressor 将静态文件放到 S3 上之后 我今天早上开始在生产环境中遇到此错误 尽管我不知道这是否相关 OperationalError could no
  • 如何持久存储目录中文件的值?

    我正在使用 C 在 VS2005 中开发 Windows 应用程序 在我的项目中 我生成 dll 并将它们存储在一个目录中 这些 dll 将被命名为 TestAssembly1 TestAssembly2 TestAssembly3 等 所
  • Node.js 连接 ftp 并下载文件

    你好 我下载了这个 npm 模块来连接到我的 ftp 节点FTPS 连接等级 var FTPS require ftps var ftps new FTPS host myhost username user password mypw p
  • Interlocked.CompareExchange 是否使用内存屏障?

    我正在阅读乔 达菲 Joe Duffy 的帖子读写易失性和时效性 我试图理解帖子中最后一个代码示例的一些内容 while Interlocked CompareExchange ref m state 1 0 0 m state 0 whi
  • 使用位置粘性删除不需要的空间

    我正在尝试使用position sticky在旋转的元素上 但我在顶部获得了额外的空间 此外 粘性元素必须停止的地方 在父元素的末尾 它会移到外面 请注意 我需要控制来选择粘性元素和左窗口侧之间放置的像素数 检查第二个屏幕截图以了解这两个问
  • Google 自定义搜索下一页

    我有以下代码 但我不知道如何打印下一页的链接 如何转到下一页 usr bin python2 4 coding utf 8 import pprint from apiclient discovery import build def ma
  • 如何将 BlueZ 配置为要求连接设备输入匹配的密钥?

    我正在尝试在嵌入式 Linux 设备上设置蓝牙 以便使用 SSP 模式 我的设备生成密码并在其显示屏上显示密码 并且要求远程端 例如用户的手机 输入匹配的密码才能使用才能成功配对 我编写 注册了一个代理 将其模式设置为 DisplayOnl
  • 为什么数组的 VarType() 总是返回 8204

    In the VarType MSDNMicrosoft VBScript 文档VarType它说的功能 粗体强调 备注 VarType 函数永远不会通过以下方式返回 Array 的值 本身 它总是添加到其他一些值来指示数组 特定类型 Va
  • 增量逻辑

    我试图更深入地了解后增量和预增量 但我有点坚持以下表达式 public static void main String args int i 0 i i i i 2 i i i 0 i i 2 i i i 0 1 3 2 1 i 0 6 1