gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:20:16 29 4
gpt4 key购买 nike

今天我来了一篇 Eric Lippert 的文章他试图澄清运算符优先级和评估顺序之间的迷思。最后有两个代码片段让我感到困惑,这是第一个片段:

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

现在想到变量值的值,我就简单的计算为1。这就是我认为它的工作原理。

  1. 首先将arr声明为一个int数组里面有一件元素;这个项目的值为 0。
  2. 其次获取arr[0] --0中的值这种情况。
  3. 第三次得到arr的值[该值步骤 2](仍然是 0)--getsarr[0] 再次——仍然是 0。
  4. 第四步赋值step 3(0) 为变量值。 --值=现在 0
  5. 添加到步骤 2 的值 1 --Now到达[0] = 1。

显然这是错误的。我试图在 c# 规范中搜索一些关于增量何时实际发生的明确声明,但没有找到任何内容。
第二个片段来自 Eric 的评论 blog post关于主题:

 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 增量发生在取消引用数组之前!
怎么会?这个post increment不是应该post的吗?即发生在其他一切之后。
我想念什么伙计们?

最佳答案

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

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

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

这是评估 E++ 的全部部分,在评估任何其他内容之前。

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


此外,对于将 LHS 归类为变量的赋值操作(如本例中),在评估 RHS 之前先评估 LHS。

所以在你的例子中:

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 规范)。

关于c# - int[] arr={0}; int 值 = arr[arr[0]++];值 = 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1260227/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com