Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;vs C#运算符优先级_C#_C++_Operator Precedence - Fatal编程技术网

C++;vs 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

我在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)*(++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的计算顺序如下

  • 计算并保存x的值
  • 该值用于计算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