C#条件AND(&&)OR(||)优先级

Jos*_*ell 70 c# conditional conditional-operator operator-precedence associativity

我们一直在工作中进入不必要的编码论证.今天我询问条件AND(&&)或OR(||)是否具有更高的优先级.我的一个同事坚持认为他们有同样的优先权,我有疑虑,所以我查了一下.

根据MSDN AND(&&)具有比OR(||)更高的优先级.但是,你能向持怀疑态度的同事证明这一点吗?

http://msdn.microsoft.com/en-us/library/aa691323(VS.71).aspx

bool result = false || true && false; // --> false
// is the same result as
bool result = (false || true) && false; // --> false
// even though I know that the first statement is evaluated as 
bool result = false || (true && false); // --> false
Run Code Online (Sandbox Code Playgroud)

所以我的问题是你如何用代码证明AND(&&)的优先级高于OR(||)?如果你的答案无关紧要,那么为什么用这种语言建立?

Fra*_* B. 108

将第一个false更改为true.我知道这似乎很愚蠢(真实|| true),但它证明了你的观点.

bool result = true || true && false;   // --> true 
     result = (true || true) && false; // --> false
     result = true || (true && false); // --> true
Run Code Online (Sandbox Code Playgroud)

  • 我们可以阻止所有这些无意义的事情,这似乎会重演自己的恶心吗?!与我重复:短路不会改变结果.短路仅适用于已知结果的情况.短路仅影响副作用 (14认同)
  • 只有当布尔表达式的结果已知时才会发生短路; 短路不能改变布尔表达式的结果. (13认同)
  • @comecme这不是短路的结果,而是改变操作的顺序.&运算符的优先级高于| 运算符,所以第一个表达式的行为就像`true | (假和假)`.这将评估为true,因为`false&false = false`,然后是`false | true = true`.但是,| operator的优先级高于&&运算符,因此第二个表达式的行为类似于`(true | false)&& false`.这将评估为false,因为`true | false = true`,然后是'true && false = false`. (9认同)
  • @James,不,不会..如果|| 具有更高的优先级,那么表达式将等同于(true || true)&& false => False,而不是true,因为在评估{true ||之后 如果是真的,剩下的就是真&&假,这不会造成短路 (5认同)
  • @James,不,如果|| 具有更高的优先级,clr将其评估为(true或true)&& false.所以首先它会评估(真|| true).在这个表达式中,是的,发生短路是因为对于OR表达,如果第一部分为真,则不需要评估第二部分.所以评估为真.现在我们有真&&假.对于&&操作,只有在第一部分为FALSE时才会发生短路,在这种情况下它不是,因此对于A && B而言,两个部分都必须为真,才能真实地进行调整.因此,它评估两个部分,并提出错误 (5认同)

Joh*_*sch 10

如果你真的想吓到他,试试:

bool result = True() | False() && False();

Console.WriteLine("-----");
Console.WriteLine(result);

static bool True()
{
    Console.WriteLine(true);
    return true;
}

static bool False()
{
    Console.WriteLine(false);
    return false;
}
Run Code Online (Sandbox Code Playgroud)

这将打印:

True
False
False
-----
False
Run Code Online (Sandbox Code Playgroud)

编辑:

回应评论:

在C#中,|是一个逻辑运算符,它执行相同的布尔逻辑||,但不会短路.此外,在C#中,|操作者具有比这两个更高的优先级||&&.

通过打印出值,您可以看到,如果我使用典型的||运算符,则只True打印第一个- 然后是表达式的结果True.

但由于优先级较高|,true | false首先进行评估(得出true),然后将结果&&编辑false为yield false.

我并没有试图显示评估的顺序,只是事实是|正常情况下评估期间的右半部分:)

  • 对回应的回应:| 仍然是二进制的.对于bool来说,它只是执行所需的操作 - 就像在C++中一样.为了澄清它,MS将其记录为bool的逻辑.但恕我直言,它只是浑水. (2认同)
  • 这将是一个有趣的恶作剧。:) (2认同)

Max*_*ing 6

这不会让你得到你想要的东西吗?或者也许我错过了一些东西......

bool result = true || false && false;
Run Code Online (Sandbox Code Playgroud)


EFr*_*aim 5

你不是用代码证明它,而是用逻辑证明它.AND是布尔乘法,而OR是布尔加法.现在哪个优先级更高?

  • 我不知道其他的downvoter,但*我*downvoted,因为这与这个问题无关.它碰巧匹配......但任何人都可以设计一种语言Foo#,这不是真的; 你的"**证明**与逻辑"如何工作呢?它可能解释了为什么选择了这个优先级,但它无法确定我安装的编译器实际上是这样做的. (11认同)
  • 在某些语言中,两者都没有(例如Smalltalk).类比可以欺骗. (8认同)
  • QED?您知道提供某些东西意味着什么吗?该语言可能是_________以遵循代数定律,但是您如何证明_____意向与大量工程工作之间,没有人弄乱并偶然违反它或在实施优先级规则时误读规范?(不太可能,但并非不可能) (3认同)
  • 我认为你所提出的观点是有效的,只是它没有资格作为"证明",其中证明比仅仅解释语言设计者决定做事的方式和原因要严格得多."他们以代数为基础,因此它必然像代数一样工作"并不是一个严格的证明(并且实际上说这种方式在逻辑上是无效的). (3认同)
  • @romkyns:这与语言有关.C和C++的规则源于代数定律.这就是为什么+的优先级小于*.你可以争辩所有你想要但你既错误又讨厌.您的编译器根据语言规范行事,语言规范在代数QED中具有基础 (2认同)
  • @EFraim:哪个代数?您假设一个特定的代数。理论计算机科学中正则表达式的普遍接受的代数等效于有限状态自动机。因此,根据您的逻辑,.NET正则表达式也应该是。但事实并非如此!QED !!!;-) (2认同)
  • @EFraim:的确如此。不是法律。因此,您的推理是一个很好的猜测,但不是一个证明。 (2认同)