C# 作为左操作和右操作的三元运算符。。或者两者都没有

C# 作为左操作和右操作的三元运算符。。或者两者都没有,c#,ternary-operator,order-of-execution,C#,Ternary Operator,Order Of Execution,问题是:如果这个问题对你们来说很清楚,请向我解释我没有看到什么。我的问题是:三元实际上是如何工作的?为了澄清我的问题:从右到左的关联性到底意味着什么?为什么关联性与求值顺序不同?这显然像一个if-else语句。它不是从右向左计算的。在我看来,这似乎是从左到右的联想 我做了布尔人来证明这一点。它告诉我它不是右联想。(我可能不理解右联想的意思。)如果它是右联想的,它会这样工作,这是给我的答案: 由于此运算符是右关联的,因此代码的工作方式为 我试图证明这一点,就像这样: int Proof =

问题是:如果这个问题对你们来说很清楚,请向我解释我没有看到什么。我的问题是:三元实际上是如何工作的?为了澄清我的问题:从右到左的关联性到底意味着什么?为什么关联性与求值顺序不同?这显然像一个if-else语句。它不是从右向左计算的。在我看来,这似乎是从左到右的联想

我做了布尔人来证明这一点。它告诉我它不是右联想。(我可能不理解右联想的意思。)如果它是右联想的,它会这样工作,这是给我的答案:

由于此运算符是右关联的,因此代码的工作方式为

我试图证明这一点,就像这样:

    int Proof = ternaryTrueOne() ? ternaryTrueTwo() ? ternaryFalseOne() ? 
ternaryTrueThree() ? ternaryFalseTwo() ? 2 : 3 : 4 : 5 : 6 : 7;
        static bool ternaryTrueOne()
    {
        Console.WriteLine("This is ternaryTrueOne");
        return true;
    }
    static bool ternaryTrueTwo()
    {
        Console.WriteLine("This is ternaryTrueTwo");
        return true;
    }
    static bool ternaryTrueThree()
    {
        Console.WriteLine("This is ternaryTrueThree");
        return true;
    }
    static bool ternaryFalseOne()
    {
        Console.WriteLine("This is ternaryFalse");
        return false;
    }
    static bool ternaryFalseTwo()
    {
        Console.WriteLine("This is ternaryFalseTwo");
        return false;
    }
在这种情况下,这将以同样的方式进行评估。对吗?这意味着ternaryfalsetwo将首先写入控制台。但事实并非如此。它一点也不写。它实际上是这样工作的,我把三元表达式写成了if语句。它从左到右工作,不必计算代码的其余部分。在第一个错误语句之后,所有其他语句都无法访问

private static int Proof2()
{
    if (ternaryTrueOne())
    {
        if (ternaryTrueTwo())
        {
            if (ternaryFalseOne())
            {
                if (ternaryTrueThree())
                {
                    if (ternaryFalseTwo())
                    {
                        return 6;
                    }
                    else
                    {
                        return 7;
                    }
                    return 5;
                }
                else
                {
                    return 6;
                }
                return 4;
            }
            else
            {
                return 5;
            }
            return 3;
        }
        else
        {
            return 4;
        }
        return 2;
    }
    else
    {
        return 3;
    }
}

原来的答案错了吗?正确的关联性到底意味着什么?

由于三元条件运算符在运算符优先级表中有自己的位置(即,没有其他运算符具有与它完全相同的优先级),关联性规则仅在消除条件运算符与其他运算符之间的歧义时适用

从右到左的关联性意味着隐式括号位于最右边的三元

就是

a?b:c?d:e

相当于

a?b:(c?d:e)


是一个有用的链接。

关联性和执行顺序是相关的,但不完全相同

关联性的存在与任何执行无关——它是在数学中定义的,数学只由纯函数构成,因此“执行顺序”与结果无关

C#中三元运算符的执行顺序非常简单:

  • 评价条件
  • 如果条件为真,则计算trueBranch;如果条件为假,则计算falseBranch
  • 您可以将关联性规则想象为“paren属于哪里”

    考虑这一点:

    a ? b : c ? d : e
    
    如果我们对关联性的工作原理一无所知,我们可以看到不同的排列方式:

    • (a?b:c)?d:e
    • a?b:(c?d:e)
    第一种方法是左关联,第二种方法是右关联

    不难看出这两种方法会导致不同的结果。比如说,

    (true ? true : false) ? false : false // false
    true ? true : (false ? false : false) // true
    
    现在,如果您在单独的
    if
    语句中重写它(这通常不是三元函数实际执行的方式,但它会执行),您将得到以下结果:

    if (a)
    {
      return b;
    }
    else
    {
      if (c) return d;
      else return e;
    }
    
    评价与简单三元法相同:

  • 评估条件
    a
  • 如果为true,则计算并返回
    b
    ;否则继续
  • 评估条件
    c
  • 如果为true,则计算并返回
    d
    ;否则,计算并返回
    e
  • 这将使关联性和执行顺序的工作方式变得显而易见。所以我们可以结束这次旅行,并解释你的例子

    我们有一系列嵌套条件:

    a ? b ? c ? 0 : 1 : 2 : 3
    
    关联性在这里是如何应用的?没有。这里没有关联操作!您正在做的是:

    a ? (b ? (c ? 0 : 1) : 2) : 3
    
    没有其他方法可以放置paren-这是解析运算符的唯一可能的方法

    由于三元运算符是三元运算符,这有点难理解,但当您将其重写为函数(例如“非内联运算符”)时,它会变得更加明显:

    没有歧义-没有其他方法来解析这个表达式

    表示与二进制运算符的关联性有点简单,所以请考虑这个场景:

    a - b - c
    
    如果您不知道
    -
    的关联性,您可以看到两种不同的方法来放置参数-
    (a-b)-c
    a-(b-c)
    ,这会产生两种不同的结果。因此,
    -
    不是关联的


    +
    “完全”关联的
    (a+b)+c
    a+(b+c)
    是完全一样的??是C#中的快捷运算符。因此,当第一个参数的值使表达式的其余部分变得无关时,就不必执行它。从左到右操作时效果更好(最左边的参数是第一个参数时更容易理解)。我觉得我迷失在某个地方了。不应该
    ternaryFalseTwo()?2:3
    part,这就是为什么
    ternaryFalseTwo()
    首先计算,这就是为什么它应该在顶部打印
    这是ternaryFalseTwo
    (a+b)+c和a+(b+c)是完全相同的东西:)@SonerGönül我本来也想解释这一点(“在数学上完全相同的东西”),但后来决定不这么做。对我来说是正确的:P但是在某种程度上,操作符是关联的,它们是相同的东西。只是在C#中,
    +
    并不总是完全关联的:D
    var f = (a, b, c) => a ? b : c;
    f(a, f(b, f(c, 0, 1), 2), 3);
    
    a - b - c