C#的运营商的运营顺序

tlg*_*tlg 0 c# c++ operator-precedence

我正在将C++实用程序移植到C#.当我在C++中运行以下语句时,我得到了正确的操作.当我在C#中运行相同的语句时,然而......

omgwtfbbq

有谁知道为什么'开始++'被执行?疯狂的是,如果我在i = 0时运行(i%2)== 0,则立即窗口返回true.

Cod*_*aos 12

运算符优先级在此问题中无关紧要.它是导致此行为的评估顺序.

在C#i++之前进行评估,i % 2因为它在左侧.因此i % 2是错误的,并且if的右侧被评估.

首先使用优先级来获取语法树:

=
  buffer[i++]
  if i % 2
    then temp[end--]
    else temp[begin++]
Run Code Online (Sandbox Code Playgroud)

在每个节点上,您从左到右评估子项.这意味着i++之前会进行评估i % 2.

Eric Lippert在这方面有很多帖子,在SO和他的博客上:

就个人而言,我会避免这样的代码.将它分成多个表达式,甚至使用普通if语句代替它更好? :


在C++中,访问一个没有序列点的变量是未定义的行为.我认为=没有序列点,所以我猜你的表达式在C++中是未定义的,只是碰巧工作了.

  • @Rob虽然可行,但仍然是可怕的代码. (3认同)