C++与C#运算符的优先级
C++ vs C# operators precedence
我在visual studio C++和C#上有相同的代码,每个编译器都有不同的输出,尽管两者具有相同的优先级和关联性表
关于C++
int i = 10;
int a = i++ + ++i + i--;
printf("a=%un",a);
i = 10;
a = i++ + i;
printf("a=%un",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#是否指定了这种疯狂代码的行为,但你不应该用任何语言写这种无稽之谈。
在C++中,代码具有未定义的行为,因为后增量运算符的副作用相对于其他操作没有完全排序。
在C#中有这样一个概念:DAS(定义分配状态);表达式i
之前的DAs必须等于表达式i - 1
之后的DAs。
表达式x++
或x--
的计算顺序如下。
- 计算并保存
x
的值 - 该值用于计算
x++
或x--
并保存 - 此保存的结果将成为操作的结果
所以考虑语句
int a = i++ + ++i + i--;
第一个表达式是i++
。对CCD_ 9进行了评价。其值为10
。它将保存为表达式的值。然后应用操作CCD_ 11。运算结果为11
。因此CCD_ 13的输出DAS等于CCD_。它是下一个表达式++i
的输入DAS。这里CCD_ 16被评估是因为存在预增量运算符。值为12
,并且i
的输出DAS为12
。CCD_ 20的评价顺序与CCD_ 21相同。所以我们有
10 + 12 + 12 = 34
表达式的CCD_ 22的输出DAS是CCD_。
也许这不是很清楚,但C++和C#之间的区别在于,C#使表达式的评估过程更加确定和清晰,以避免未定义的行为。
相关文章:
- C++ 带有函数指针的运算符优先级
- <<运算符优先级与字符串比较
- 在一个指令中声明更多指针的运算符优先级
- C++逗号运算符的优先级
- 为什么括号在这种情况下无法更改c++运算符的优先级
- C++中的运算符优先级
- c++中的增量和三元运算符优先级
- 涉及模运算符优先级的错误以及C++中具有大数字的括号
- 带有 cout 和指针的运算符优先级
- C++ 使用矢量迭代器时的运算符优先级
- 好友与成员运算符重载的优先级
- 序列点和运算符优先级有什么区别
- 运算符优先级 括号问题
- C++表达式中的运算符优先级
- 相等运算符优先级不起作用
- 类构造函数比"="运算符具有更高的优先级?
- 为什么 C++ 中指向方法取消引用运算符的指针具有如此低的优先级
- 如何使用将 const int 的运算符用作 int* 优先级队列的比较器
- 递增和按位移位运算符优先级?
- C++,计算具有多个"&&"且没有较低优先级运算符的表达式