【问题标题】:C# if statement interpretationC# if 语句解释
【发布时间】:2020-05-29 13:01:36
【问题描述】:

我对一件简单的事情感到困惑。在我看来,第 4 行的结果必须与第 6 行的结果相同。有人能解释一下优化器在第 5 行做了什么吗?

我希望b 在每一行上递减和递增。因此,b 的值必须在解释行的开头为 2。所以第 4 行和第 6 行的结果应该是一样的。

1. int a = 1;
2. int b = 2;
3. 
4. Console.WriteLine(a == --b && a == b++); // expected: true, real: true
5. Console.WriteLine(a == --b || a == b++); // expected: true, real: true 
6. Console.WriteLine(a == --b && a == b++); // expected: true, real: false

【问题讨论】:

  • 请解释为什么你认为4和6的输出应该是一样的。 (提示,b 在这两个语句的开头没有相同的值,这与您的意图相反)
  • b 在每一行上递减和递增。所以 b 的起始值必须在解释行的开头为 2。所以第 4 行和第 6 行的结果必须相同。
  • 我知道这可能只是理解c#的一个学术例子。但是你看到了结果。很难阅读。切勿在实际代码中将增量与布尔表达式混合。
  • 实际上,虽然我同意不将递增或递减运算符混入其他表达式,但这里的问题实际上是与短路布尔运算符结合使用的表达式中的副作用。
  • 作为一个小补充,您可以使用if (a == --b | a == b++) | 运算符永远不会短路并始终评估双方,从而产生您想要的行为

标签: c# logic


【解决方案1】:

在第 4 行,b 递减和递增,留下 2。

在第 5 行中,b 递减,然后因为 a == --btrue,表达式短路,b 不递增,留下 1。

第 6 行中的 a == --b 现在是 false

【讨论】:

    【解决方案2】:

    当调用 4. 和 5. 行时,它也会改变变量的值:

    a 是 1,b 是 2

    a == --b && a == b++ = true
    

    a 是 1,b 是 2

    a == --b && a == b++ = true
    

    a 为 1,b 为 1,因为上述语句的第二部分没有运行。如果 or (||) 运算符的第一部分为真,则不会执行第二部分。

    a == --b && a == b++ = false
    

    a 不等于 0 (1 - 1)

    【讨论】:

      【解决方案3】:

      ||运算符应用short-circuit evaluation
      所以,对于 ||运算符,如果表达式的第一项为真,则无需计算(执行)第二项。

      这个逻辑对你的代码的影响是第5行表达式的第二部分没有执行,变量b在递减后保持为1。
      这导致第 6 行给出 false 作为结果

      【讨论】:

        【解决方案4】:
        1. int a = 1;
        2. int b = 2;
        3. 
        4. Console.WriteLine(a == --b && a == b++); // expected: true, real: true
        5. Console.WriteLine(a == --b || a == b++); // expected: true, real: true 
        6. Console.WriteLine(a == --b && a == b++); // expected: true, real: false
        

        变成

        1. int a = 1;
        2. int b = 2;
        3.
        
           // now: a = 1, b = 2
           // b is decremented to 1, expressions are evaluated. b is incremented to 2,
        4. Console.WriteLine(1 == 1 && 1 == 1); 
        
           // now: a = 1, b = 2
           // b is decremented to 1, first expression is evaluated to true, 
           // that causes the second expression to be short circuited. It doesnt 
           // matter whether it is true or false, the whole expression will be true anyway.
           // So the second expression will not be executed.
        5. Console.WriteLine(1 == 1);   
        
           // now: a = 1, b = 1
           // b is decremented to 0, expressions are evaluated, b is incremented to 1
        6. Console.WriteLine(1 == 0 && 1 == 0); 
        

        【讨论】:

          猜你喜欢
          • 2014-03-29
          • 1970-01-01
          • 2014-02-17
          • 2015-04-03
          • 1970-01-01
          • 2016-06-16
          • 2017-12-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多