C ++ vs C#运算符优先级

时间:2014-01-14 12:14:22

标签: c# c++ operator-precedence

我在visual studio 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#中,我发现操作遵循优先级表,后增量具有更高的优先级,即预增量,因此它将值放置然后增加 我找不到任何合乎逻辑的解释。任何人都可以解释一下吗?

2 个答案:

答案 0 :(得分:3)

这不是优先案例,而是操作数评估顺序和副作用排序。在C ++中,评估顺序是未指定的,并且您还会从变量的无序修改中获得未定义的行为。

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

答案 1 :(得分:1)

在C ++中,代码具有未定义的行为,因为后增量运算符的副作用与其他操作符不完全相同。

在C#中,在表达式i - 1之后,表达式i必须等于DAS之前,存在DAS(定义赋值状态)/ DA这样的概念。

表达式x ++或x--的计算顺序如下。

  1. 计算并保存x的值。
  2. 该值用于计算x ++或x--并保存。
  3. 此保存的结果将成为操作的结果。
  4. 所以考虑声明

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

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

    10 + 12 + 12 = 34

    表达式i的输出DAS为11。

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