我曾尝试在C#和C++以下的事情:C#和C++中的评估顺序是什么?
int a = 5;
int b = (a++)+(++a)+(a--)+(--a);
我试图让b在C#和C++的结果。 但我在两个方面都得到了不同的答案。
我在C#中得到了23个,在C++中得到了20个。
那么,请回答我为什么这样呢?这可能是什么原因?
我曾尝试在C#和C++以下的事情:C#和C++中的评估顺序是什么?
int a = 5;
int b = (a++)+(++a)+(a--)+(--a);
我试图让b在C#和C++的结果。 但我在两个方面都得到了不同的答案。
我在C#中得到了23个,在C++中得到了20个。
那么,请回答我为什么这样呢?这可能是什么原因?
C#从左到右进行评估。在C++中,funny expressions(如您的调用undefined behavior)是因为您正在更改变量并重新读取它,而没有介入sequence point。
这意味着不同的编译器(或甚至具有不同优化设置的相同编译器)被允许(并且通常将)产生(a++)+(++a)+(a--)+(--a)
的不同结果。
查看here获取C++的完整列表。正如FredOverflow说,C#评估来自左到右
表达已明确定义在C#行为(从评价从左到右)
在C#,输出将是24(未23)
int b = (a++)+(++a)+(a--)+(--a);
// 5 + 7 + 7 + 5 = 24
在C++中,表达式调用Undefined Behaviour,因为a
在两个sequence points之间被修改了不止一次。
无论如何我都需要看这个,所以我想在这里发表。
从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
我不认为对尖端`@`语法跨越答案工程:) – fredoverflow 2010-11-27 11:15:31
编辑了:-P谢谢。 – Bojangles 2010-11-27 11:19:11