2014-01-14 46 views
-1

我有视觉工作室C++和C#和每个编译器相同的代码具有不同的输出虽然都具有相同的优先级和结合C++对C#运算优先

在C++

int i = 10; 
    int a = i++ + ++i + i--; 
    printf("a=%u\n",a); 

    i = 10; 
    a = i++ + i; 
    printf("a=%u\n",a); 

    int x=2,y=3; 
    int z=((x++)*(x++))+((++y)*(++y)); 
    printf("x=%u , y=%u , z=%u \n",x,y,z); 

输出是

a=33 
a=20 
x=4 , y=5 , z=29 

在C#

  int i = 10; 
      int a = i++ + ++i + i--; 

      Console.WriteLine("a={0}",a); 

      i = 10; 
      a = i++ + i; 

      Console.WriteLine("a={0}", a); 

      int x = 2, y = 3; 
      int z=((x++)*(x++))+((++y)*(++y)); 
      Console.WriteLine("x={0} , y={1} , z={2}",x,y,z); 

输出

a=34 
a=21 
x=4 , y=5 , z=26 

在C#中我发现,操作服从优先级表后递增具有更高的优先级是预增,因此它把值则增加 我无法找到任何合理的解释。有谁能解释这个吗?

+0

您的C++代码中存在未定义的行为,因为您多次修改了未被序列化的“i”。什么事情都可能发生。我不知道C#如何处理这个问题。 –

回答

1

在C++中,代码具有未定义的行为,因为postincrement操作符的副作用相对于其他操作符没有完全排序。

在C#有这样概念作为DAS(限定分配状态)/表达式之前的DA我必须表达后等于DAS I - 1

表达的计算的阶x ​​++或x--以下。

  1. 计算并保存x的值。
  2. 该值用于计算x ++或x--并保存。
  3. 该保存的结果成为操作的结果。

所以考虑声明

INT A = I + + + +我+我 - ;

第一个表达式是i ++。我被评估。它的值是10.它被保存为表达式的值。然后操作++就可以了。操作的结果是11.所以i的输出DAS等于11.它是下一个表达式++ i的输入DAS。这里++我评估,因为有preincrement算子。的值是12和i的输出DAS是评价12.The顺序我 - 相同我++ /因此,我们有

10 + 12 + 12 = 34

AMD i的输出DAS的表达是11。

也许它不是很清楚,但C++和C#的区别在于C#使得ecaluation表达式的过程更加明确和清晰,以避免未定义的行为。

3

这不是优先级的情况,而是操作数评估顺序和副作用排序。在C++中,评估顺序未指定,并且您也可以通过对变量进行无序修改来获取未定义的行为。

我不知道C#是否指定了这种疯狂的代码的行为,但你不应该写任何语言的这种废话。

+0

有关更多详细信息,请参阅http://stackoverflow.com/questions/7698293/why-does-the-postincrement-has-a-higher-precedence-than-preincrement –