赋值然后评估每个参数"模式"是否具有名称?
时间: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 ++中,标准说评估顺序是不确定的。