如何测试c中条件运算符的正确结合性

本文关键字:条件运算符 结合 何测试 测试 | 更新日期: 2023-09-27 17:59:13

我编写了以下代码。

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;
}

由于第一个条件总是真的,xyz将得到的值是12,但由于条件运算符本身是右关联的,我预计getValue()函数将首先执行,并打印"hello"。当我运行这个代码时,它不会以那种方式运行。

有人能告诉我这种行为吗。

如何测试c中条件运算符的正确结合性

这:

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

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。实际输出为1,2,显示了正确的关联性。

如果您将代码翻译成..else语句,它将是-

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

由于第一个if条件的计算结果为true,所以else将不会执行,您将在控制台上打印12。