我在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#中,我发现操作遵循优先级表,后增量具有更高的优先级,即预增量,因此它将值放置然后增加 我找不到任何合乎逻辑的解释。任何人都可以解释一下吗?
答案 0 :(得分:3)
这不是优先案例,而是操作数评估顺序和副作用排序。在C ++中,评估顺序是未指定的,并且您还会从变量的无序修改中获得未定义的行为。
我不知道C#是否指定了这种疯狂代码的行为,但你不应该用任何语言编写这样的废话。
答案 1 :(得分:1)
在C ++中,代码具有未定义的行为,因为后增量运算符的副作用与其他操作符不完全相同。
在C#中,在表达式i - 1之后,表达式i必须等于DAS之前,存在DAS(定义赋值状态)/ DA这样的概念。
表达式x ++或x--的计算顺序如下。
所以考虑声明
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表达式的过程更加不确定,并且明确了逃避未定义的行为。