赋值然后评估每个参数"模式"是否具有名称?

时间:2020-03-06 15:03:13  来源:igfitidea点击:

以下代码片段:

int i = 1;
  string result = String.Format("{0},{1},{2}", i++, i++, i++);
  Console.WriteLine(result);

写出:1,2,3

在编译器中尝试此操作之前,我希望先进行赋值,然后进行求值,所以我的预期输出为:1,1,1

所以我的问题是:赋值然后评估每个参数的这个"模式"(是否称为模式?)是否有名称?

编辑:我指的是评估并将参数分配给String.Format()函数的模式。不是i的增量。

(在上面的问题中,我可能错误地使用了评估一词,因为如果参数为(i + j),那么我们知道它将在赋值之前进行评估。 i的增量。)

解决方案

在C#中,参数的求值顺序严格从左到右。当我们对表达式" i ++"求值时,会发生计算并推入" i"的值,然后将" i"的值递增。

System.Int32上的++运算符实际上是一个函数,具有特殊名称" ++"和特殊语法,可以通过先编写对变量的引用,然后编写对字符++的引用来调用它。

所以实际上,你写的是

// assume this function is defined:
int Inc(ref int i)
{
  var old = i;
  i = i + 1;
  return old;
}

...
int i = 1;
string result = String.Format("{0},{1},{2}", Inc(ref i), Inc(ref i), Inc(ref i));
Console.WriteLine(result);
...

由于参数是从左到右求值的,因此会调用Inc(ref i)3次,每次在将i的当前值传递给String.Format(...)之后将i递增一次。这也正是代码中发生的情况。

函数的参数在C#中从左到右求值。在C / C ++中不是这种情况,在C / C ++中,标准说评估顺序是不确定的。