int[] arr={0}; int 值 = arr[arr[0]++];值 = 1?

2023-12-20

今天我看到一篇文章埃里克·利珀特 http://blogs.msdn.com/ericlippert他试图澄清运算符优先级和求值顺序之间的迷思。最后有两个代码片段让我感到困惑,这是第一个片段:

      int[] arr = {0};
      int value = arr[arr[0]++];

现在,当我考虑变量值的值时,我只是将其计算为 1。这就是我认为它是如何工作的。

  1. 首先声明 arr 为 int 数组 里面有一件物品;这 项目的值为 0。
  2. 其次获取arr[0] --0中的值 这个案例。
  3. 第三步获取arr的值[值 步骤 2](仍然是 0)--gets 再次 arr[0] ——仍然是 0。
  4. 第四步 赋值步骤3的值 (0) 为变量值。 --值= 现在 0
  5. 添加到步骤 2 1 的值 --Now arr[0] = 1。

显然这是错误的。我尝试在 C# 规范中搜索一些有关增量何时实际发生的明确声明,但没有找到任何内容。
第二个片段来自 Eric 的评论博客文章 http://blogs.msdn.com/ericlippert/archive/2009/08/10/precedence-vs-order-redux.aspx关于主题:

 int[] data = { 11, 22, 33 }; 
 int i = 1;
 data[i++] = data[i] + 5;

现在,我认为这个程序将如何执行——在声明数组并将 1 分配给 i 之后。 [请耐心听我说]

  1. 获取数据[i]--1
  2. 将步骤 1 的值添加到该值 5 --6
  3. 分配给data[i](仍然是1) 步骤 2 的值 --data[i] = 6
  4. 增加 i -- i = 2

根据我的理解,这个数组现在应该包含值 {11,27,33}。但是,当我循环打印数组值时,我得到:{11, 38, 33}。这意味着post增量发生在取消引用数组之前!
怎么会?这个帖子增量不是应该是帖子吗?即发生在其他一切之后。
我缺少什么?伙计们?


后递增操作作为计算整个表达式的一部分发生。这是在计算值之后但在计算任何其他表达式之前发生的副作用。

换句话说,对于任何表达式 E,E++(如果合法)表示类似(伪代码)的内容:

T tmp = E;
E += 1;
return tmp;

That's all在评估其他任何内容之前,评估 E++ 的一部分。

有关更多详细信息,请参阅 C# 3.0 规范的第 7.5.9 节。


此外,对于 LHS 被分类为变量的赋值运算(如本例所示),将计算 LHSbefore评估 RHS。

所以在你的例子中:

int[] data = { 11, 22, 33 }; 
int i = 1;
data[i++] = data[i] + 5;

相当于:

int[] data = { 11, 22, 33 }; 
int i = 1;
// Work out what the LHS is going to mean...
int index = i;
i++;
// We're going to assign to data[index], i.e. data[1]. Now i=2.

// Now evaluate the RHS
int rhs = data[i] + 5; // rhs = data[2] + 5 == 38

// Now assign:
data[index] = rhs;

规范的相关部分是第 7.16.1 节(C# 3.0 规范)。

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

int[] arr={0}; int 值 = arr[arr[0]++];值 = 1? 的相关文章

随机推荐

  • WinUI 3.0 桌面 - C# 页面导航

    我正在尝试进行简单的页面导航 但无法找到有关如何在 WinUI 3 0 中执行此操作的任何文档 目前 当我使用 WinUI 3 0 创建空白应用程序时 我在 App xaml cs 中创建了以下代码 protected override v
  • 如何在 Hibernate Criteria 中添加 Distinct

    在我的数据库中 我有一个测试表 其中包含列 testName testType 有 2 个不同的测试具有相同的类型 即 SUN 所以我只想要其中一个 我在休眠 标准中使用 Distinct 如下所示 但它仍然给我两种名称与 sun 相同的类
  • 实体框架模型 - 不允许我添加某些表

    在执行 ADO Net 实体数据模型 向导时 我从数据库中选择了 3 个表以添加到我的 edmx 文件中 并且当生成文件时 只有三个表之一存在 没有错误或警告来解释为什么尚未添加其他表 如果我尝试单独添加一个失败的表 那么什么也不会发生 我
  • 如何通过ADB锁定Android屏幕?

    有没有办法通过 ADB 锁定 Android 屏幕 我找到了在apk中锁定显示的方法 但我想通过ADB从PC锁定屏幕 以模拟显示超时 而不必等待超时 是否有可能做到这一点 谢谢 黛安 酷 我刚刚发现KEYCODE POWER即 26 所以它
  • InterfaceError:2013:查询期间丢失与 MySQL 服务器的连接

    当我尝试连接到MySql数据库服务器位于Python on 谷歌云平台 我收到错误 以下是实际代码 import mysql connector import pandas as pd cnx mysql connector connect
  • 我对 Homestead.yaml 的更改在我 vagrant up 后没有反映在虚拟环境中

    我在 Homestead yaml 文件 C Users username homestead 中编辑了共享文件夹映射规则 然后 我输入 vagranthalt 命令来关闭vagrant 然后 我进入了 vagrant up 但是 我对文件
  • notificationDataSetChanged() 不更新列表视图

    我正在从我的后台方法更新我的列表视图 runOnUiThread new Runnable public void run Updating parsed JSON data into ListView BaseAdapter adapte
  • Hudson:将工件从主服务器复制到从服务器失败

    是否可以使用 复制工件 插件将工件从在主节点上运行的作业复制到在从节点上运行的下游作业 我在从站上收到一个错误 内容如下 hudson util IOException2 hudson util IOException2 无法提取 srv
  • 鸭子类型与旧的“变体”类型和/或接口有何不同?

    我经常看到 鸭子打字 这个短语 甚至还遇到过一两个代码示例 我太懒忙于做自己的研究 有人可以简单地告诉我 鸭子型 和老式 变体型 之间的区别 以及 提供一个示例 说明我可能更喜欢鸭子类型而不是变体类型 并且 提供一个我想要的例子have使用
  • 在 ggplot 中绘制连续协变量的预测生存曲线

    如何绘制 cox 比例风险模型中连续协变量的代表值的生存曲线 具体来说 我想在 ggplot 中使用 survfit cox survfit 对象来执行此操作 这似乎是一个已经得到解答的问题 但我已经使用术语 survfit 和 newda
  • iPhone 应用程序:Web 应用程序还是本机应用程序?

    我计划为我们的在线网络应用程序创建一个 iPhone 应用程序版本 我对 iPhone 应用程序开发还是个新手 所以我不知道是选择 iPhone 本机还是在 iPhone 浏览器上运行的 Web 应用程序 这个要求实际上是非常基本的 iPh
  • 如何在解决方案上有选择地使用 dotnet pack

    我有一个解决方案foo sln 里面的所有库都是 SDK 项目 然而 只有其中之一应该是packed 默认情况下 dotnet pack 尝试打包所有项目 与此相关 没有排除过滤器或包含过滤器 推荐的流程是什么 您可以通过在其中设置属性来选
  • 为什么在 Makefile 中安装文件时 $(INSTALL_BIN) 和 $(INSTALL_DATA) 总是删除软链接

    在 OpenWrt 包 Makefile 的安装部分 以下代码将从 lib 文件中删除软链接并将实例复制到 1 在构建 编译部分 我们在 PKG BUILD DIR 下构建了 3 个库 PKG BUILD DIR libapi so gt
  • B 树与位图数据库索引

    有人可以解释一下位图索引和 b 树索引之间的区别吗 在什么情况下你会使用这两种方法 各自的优点 缺点是什么 来自维基百科 B Trees http en wikipedia org wiki B tree and 位图索引 http en
  • vimperator 自动隐藏状态行

    大多数时候 Vimperator 状态线只是坐在那里 占据空间 有什么办法可以自动隐藏它 以便仅在我使用它时显示吗 main coon 和 libjs 在最近的 Firefox 中不起作用 基于http blog yjl im 2011 0
  • e: [kapt] 找不到“com.sun.tools.javac.util.Context”类(插件类路径中缺少“tools.jar”)。卡普特不会工作

    我的项目之前一直运行良好 直到我升级到API 28并重构为Androidx 首先我认为我必须解决问题代码 因为重构后未解决的参考代码太多 解决了很多问题后 我仍然收到错误 org gradle initialization Reported
  • SDWebImage更改cacheMaxCacheAge

    如何更改静态值cacheMaxCacheAge当我使用SDWebImage时 有什么办法好呢 我需要将图像缓存 5 分钟 In SDWebImage 5 0 maxCacheAge 重命名为 maxDiskAge 您可以像这样设置最大缓存时
  • Resteasy 中的全局自定义异常处理程序

    是否可以为所有意外错误创建全局异常处理程序 因为不可能像这样创建所有可能的类 public class ExceptionHandler implements ExceptionMapper
  • 多个 onbeforeunload() 和 onunload() 事件

    我从客户那里收到一个奇怪的问题 因为我们的代码 其中包括使用 onbeforeunload 触发一个对话框 但他们还包含另一个公司的代码 该代码也绑定此事件处理程序 两者可以同时执行吗 我一直在读这个http oreilly com cat
  • int[] arr={0}; int 值 = arr[arr[0]++];值 = 1?

    今天我看到一篇文章埃里克 利珀特 http blogs msdn com ericlippert他试图澄清运算符优先级和求值顺序之间的迷思 最后有两个代码片段让我感到困惑 这是第一个片段 int arr 0 int value arr ar