我在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#中,我发现该操作服从优先级表,即后递增的优先级高于前递增的优先级,因此将值放在后递增,我对此找不到任何逻辑解释。有人可以解释吗?
在C ++中,该代码具有未定义的行为,因为后增量运算符的副作用相对于其他操作而言没有完全排序。
在C#中,表达式i之前的DAS(定义分配状态)/ DAs必须等于表达式i-1之后的DAS。
表达式x ++或x的计算顺序如下。
所以考虑一下声明
int a = i ++ + ++ i + i--;
第一个表达式是i ++。我被评估。它的值为10。将另存为表达式的值。然后执行操作++。运算的结果为11。因此,i的输出DAS等于11。它是下一个表达式++ i的输入DAS。因为有预递增运算符,所以这里对++ i进行了评估。值是12,i的输出DAS是12.i的求值顺序-与i ++ /相同
10 + 12 + 12 = 34
表达式i的输出DAS为11。
也许不是很清楚,但是C ++和C#之间的区别在于C#使升级表达式的过程更具确定性,并清楚地逃避了未定义的行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句