首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >三值算子既是左算子,又是右算子。或者两者都没有

三值算子既是左算子,又是右算子。或者两者都没有
EN

Stack Overflow用户
提问于 2015-11-26 12:43:20
回答 2查看 697关注 0票数 5

问题是:如果你对这个问题很清楚,请向我解释一下我看不到的东西。我的问题是:三元实际上是如何工作的?为了澄清我的问题:从右到左联想到底意味着什么?为什么联想性与评价的顺序不一样?很明显,这就像一份“如果其他声明”。它不是从右到左计算的。在我看来,这是从左到右的联想。

我做布尔人是为了证明这一点。这表明它不是正确的联想。(我可能不明白什么是正确的联想。)如果它是正确的联想,它会像这样工作,这是一个答案,给了我:

因为这个运算符是正确关联的,所以您的代码的工作方式是:

代码语言:javascript
复制
true ? false ? false ? false ? 3 : 4 : 5 : 6 : 7
evaluated as;

true ? false ? false ? (false ? 3 : 4) : 5 : 6 : 7
which evaluated as;

true ? false ? false ? 4 : 5 : 6 : 7
which evaluated as;

true ? false ? (false ? 4 : 5) : 6 : 7
which evaluated as;

true ? false ? 5 : 6 : 7
which evaluated as;

true ? (false ? 5 : 6) : 7
which evaluated as;

true ? 6 : 7
which returns 6.

我试着证明这个,就像这样:

代码语言:javascript
复制
    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;
    }

在这种情况下,将以同样的方式对其进行评估。对吗?这意味着三真核两者将首先写入控制台。但事实并非如此。它一点也不写。它实际上是这样工作的,我已经把三元表达式写成了if语句。它从左到右工作,不需要计算代码的其余部分。在第一个false语句之后,所有其他语句都是不可访问的。

代码语言:javascript
复制
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;
    }
}

原来的答案是错的吗?正确的结合意味着什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-26 12:51:27

由于三元条件运算符在运算符优先级表中有自己的位置(即没有其他运算符具有与其完全相同的优先级),因此关联规则仅适用于从另一个操作符中消除条件运算符的歧义。

从右到左的结合意味着隐式括号在最右边的三元附近。

那是,

a ? b : c ? d : e

等于

a ? b : (c ? d : e)

associativity是一个有用的链接。

票数 5
EN

Stack Overflow用户

发布于 2015-11-26 13:01:13

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

相联性不受任何执行的影响--它是在数学中定义的,它完全由纯函数构成,所以“执行顺序”对结果没有影响。

在C#中,三元操作符中的执行顺序非常简单:

  1. 评价条件
  2. 如果条件为true,则计算trueBranch,如果条件为false,则计算falseBranch

你可以把联想规则想象成“父母在哪里”。

考虑到这一点:

代码语言:javascript
复制
a ? b : c ? d : e

如果我们不知道联想是如何工作的,我们可以看到不同的方式来放置父母:

  • (a )?B: c)?D:e
  • 一个?B:(c?D: e)

第一种方法是左联想式,第二种是右联想式。

不难看出,这两种方法导致了不同的结果。例如,

代码语言:javascript
复制
(true ? true : false) ? false : false // false
true ? true : (false ? false : false) // true

现在,如果您用单独的if语句重写它(这通常不是三元语句实际执行的方式,但它会这样做),您将得到以下结果:

代码语言:javascript
复制
if (a)
{
  return b;
}
else
{
  if (c) return d;
  else return e;
}

评估结果与简单三元相同:

  1. 评价条件a
  2. 如果为true,则计算并返回b;否则继续
  3. 评价条件c
  4. 如果为true,则计算并返回d;否则计算并返回e

这应该清楚地表明执行的关联性和执行顺序如何工作。这样我们就可以完成这次旅行,并解释你的例子。

我们有一系列嵌套条件:

代码语言:javascript
复制
a ? b ? c ? 0 : 1 : 2 : 3

结合性在这里是如何应用的?没有,这里没有联合操作!你要做的是:

代码语言:javascript
复制
a ? (b ? (c ? 0 : 1) : 2) : 3

没有其他方法来放置父类--这是解析操作符的唯一可能方法。

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

代码语言:javascript
复制
var f = (a, b, c) => a ? b : c;
f(a, f(b, f(c, 0, 1), 2), 3);

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

使用二进制运算符显示相联性要简单一些,因此请考虑以下场景:

代码语言:javascript
复制
a - b - c

如果你不知道-的结合性,你可以看到两种不同的方法来放置父母-- (a - b) - ca - (b - c),这可以给出两个不同的结果。因此,-不是关联的。

+相比,它是(完全)关联的-- (a + b) + ca + (b + c)完全相同。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33939059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档