2010-11-27 71 views
5

我曾尝试在C#和C++以下的事情:C#和C++中的评估顺序是什么?

int a = 5; 
int b = (a++)+(++a)+(a--)+(--a); 

我试图让b在C#和C++的结果。 但我在两个方面都得到了不同的答案。

我在C#中得到了23个,在C++中得到了20个。

那么,请回答我为什么这样呢?这可能是什么原因?

回答

7

C#从左到右进行评估。在C++中,funny expressions(如您的调用undefined behavior)是因为您正在更改变量并重新读取它,而没有介入sequence point

这意味着不同的编译器(或甚至具有不同优化设置的相同编译器)被允许(并且通常)产生(a++)+(++a)+(a--)+(--a)的不同结果。

0

查看here获取C++的完整列表。正如FredOverflow说,C#评估来自左到右

+2

我不认为对尖端`@`语法跨越答案工程:) – fredoverflow 2010-11-27 11:15:31

+0

编辑了:-P谢谢。 – Bojangles 2010-11-27 11:19:11

4

表达已明确定义在C#行为(从评价从左到右)

在C#,输出将是24(未23)

int b = (a++)+(++a)+(a--)+(--a); 

     // 5 + 7 + 7 + 5 = 24 

在C++中,表达式调用Undefined Behaviour,因为a在两个sequence points之间被修改了不止一次。

0

无论如何我都需要看这个,所以我想在这里发表。

从C#5.0规格

5.3.3.21通用规则表达式以下规则适用于这些类型的表达式嵌入式表达式

:括号表达式(§7.6.3)元素访问表达式(第7.6.6节),带索引的基本访问表达式(第7.6.8节),递增和递减表达式(第7.6.9节,第7.7.5节),强制表达式(第7.7.6节),一元+ - ,〜,*表达式,二进制+, - ,*,/,%,< <,>>,<,< =, - >,=,==,!=,是,&,|,^表达式(§7.8,§7.9,§7.10,§7.11),复合赋值表达式(§7.17.2),勾选和未勾选的表达式§7.6.12),再加上数组和委托创建表达式(§7.6.10)。

这些表达式中的每一个都有一个或多个子表达式,这些子表达式以固定顺序(重点矿井)无条件地被评估为。例如,二进制%运算符评估操作符的左侧,然后评估右侧。索引操作评估索引表达式,然后按照从左到右的顺序评估每个索引表达式。

每种表达式的详细规则请参见第7节。我不会在这里列出所有这些表达式,但启发式是按照代码写成的。例如。

7.5.1.2参数的运行时评估列出

参数列表中的表达在它们的排列顺序一直被运用。因此,示例

class Test 
{ 
    static void F(int x, int y = -1, int z = -2) { 
      System.Console.WriteLine("x = {0}, y = {1}, z = {2}", x, y, z); 
    } 
    static void Main() { 
      int i = 0; 
      F(i++, i++, i++); 
      F(z: i++, x: i++); 
    } 
} 

产生输出

x = 0, y = 1, z = 2 
x = 4, y = -1, z = 3