今天我看到了Eric Lippert的一篇文章,他试图澄清运算符优先级和评估顺序之间的神话。最后有两个代码片段让我感到困惑,这是第一个片段:
int[] arr = {0};
int value = arr[arr[0]++];
现在当我考虑变量 value 的值时,我只是简单地将其计算为 1。这就是我认为它的工作方式。
- 首先将 arr 声明为一个 int 数组,其中包含一个项目;该项目的值为 0。
- 在这种情况下,第二次获取 arr[0] --0 的值。
- 第三次获取 arr[步骤 2 的值] 的值(仍为 0) -- 再次获取 arr[0] -- 仍为 0。
- 第四步将步骤 3 (0) 的值赋给变量值。--value = 0 现在
- 添加到第 2 步的值 1 -- 现在 arr[0] = 1。
显然这是错误的。我试图在 c# 规范中搜索一些关于何时实际发生增量的明确声明,但没有找到任何内容。
第二个片段来自 Eric关于该主题的博客文章的评论:
int[] data = { 11, 22, 33 };
int i = 1;
data[i++] = data[i] + 5;
现在这就是我认为这个程序将如何执行——在声明数组并将 1 分配给 i 之后。[请忍受我]
- 获取数据[i] --1
- 将值 5 --6 添加到第 1 步的值
- 将第 2 步的值赋给 data[i](仍为 1) --data[i] = 6
- 递增 i -- i = 2
根据我的理解,这个数组现在应该包含值 { 11、27、33 }。但是,当我循环打印得到的数组值时:{11、38、33}。这意味着后增量发生在取消引用数组之前!
怎么会?这个帖子增量不应该是帖子吗?即发生在其他一切之后。
我想念什么?