繁体   English   中英

如何在C#中测试条件运算符的右关联性

[英]How to test the right-associativity of conditional operator in c#

我写了下面的代码。

static void Main(string[] args)
{
    var xyz = 10 < 11 ? 12 : 5 < 21 ? getValue() : 15;
    Console.WriteLine(xyz);
    Console.ReadLine();
}

static int getValue()
{
    Console.WriteLine("hello");
    return 100;
}

由于第一个条件始终为true,因此xyz将获得的值为12,但是由于条件运算符本身是正确的关联,因此我期望getValue()函数将首先执行,并且将输出“ hello”。 当我运行此代码时,它不会那样运行。

有人可以启发我这种行为。

这个:

var xyz = 10 < 11 ? 12 : 5 < 21 ? getValue() : 15;

被视为:

var xyz = 10 < 11 ? 12 : (5 < 21 ? getValue() : 15);

所以我们有一个条件表达式:

  • 条件: 10 < 11
  • 第一分支: 12
  • 第二分支: 5 < 21 ? getValue() : 15 5 < 21 ? getValue() : 15

由于10 < 11为真,因此评估第一个分支,但不评估。

关联性不像在每个操作数中都使用bool表达式的代码那样容易地显示出来,因为可以使用两种关联性进行编译。

考虑以下代码:

using System;

class Test
{
  static void Main()
  {            
    var xyz = Log(1, true) ? Log(2, true) : Log(3, true) ? Log(4, false) : Log(5, true);
  }

  static bool Log(int x, bool result)
  {
    Console.WriteLine(x);
    return result;
  }
}

为了简单起见,将每个Log(x, ...)重命名为Lx ,我们有:

var xyz = L1 ? L2 : L3 ? L4 : L5;

可以这样处理:

// Right associativity
var xyz = L1 ? L2 : (L3 ? L4 : L5);

// Left associativity
var xyz = (L1 ? L2 : L3) ? L4 : L5;

给定我们要返回的结果,我们希望看到右结合性为1、2的输出。如果是左边结合性,我们将会看到1、2、4的实际输出。关联。

如果将代码转换为in..else语句,则它将是-

        int xyz = 0;
        if (10 < 11)
        {
            xyz = 12;
        }
        else
        {
            if (5 < 21)
            {
                xyz = getValue();
            }
            else
            {
                xyz = 15;
            }
        }

并且由于第一个if条件评估为true,否则else将不会执行,您将在控制台上打印12。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM