C++;vs C#运算符优先级
我在VisualStudioC++和C语言中有相同的代码,每个编译器都有一个强的>不同的输出,虽然<强>两者具有相同的优先级和关联性< /强>表 关于C++C++;vs C#运算符优先级,c#,c++,operator-precedence,C#,C++,Operator Precedence,我在VisualStudioC++和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
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#
输出是
a=34
a=21
x=4 , y=5 , z=26
在C#中,我发现操作遵循优先级表,即增量后的优先级高于增量前的优先级,因此它先放置值,然后再放置增量
我找不到任何合乎逻辑的解释。有人能解释一下吗?这不是优先级的问题,而是操作数求值顺序和副作用顺序的问题。在C++中,评估顺序是未指定的,并且还从变量的未修改修改获得未定义的行为。
<>我不知道C++是否指定了这种疯狂的代码的行为,但是你不应该用任何语言写这样的废话。C++中的< p>代码有不明确的行为,因为后增量运算符的副作用相对于其它操作不精确排序。 在C#中,有这样一个概念,即DAS(定义赋值状态)/DAS在表达式i之前必须等于DAS在表达式i-1之后 表达式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 amd表达式i的输出DAS为11<>也许不是很清楚,但是C++和C的区别在于C语言使Engess表达式的过程更加明确,并且能够避免一个未定义的行为。你在C++代码中有未定义的行为,因为你正在修改<代码> I/COM>多次未排序的代码。任何事情都有可能发生。我不知道C#如何处理这个问题。有关更多详细信息,请参阅
a=34
a=21
x=4 , y=5 , z=26