问题是:如果你对这个问题很清楚,请向我解释一下我看不到的东西。我的问题是:三元实际上是如何工作的?为了澄清我的问题:从右到左联想到底意味着什么?为什么联想性与评价的顺序不一样?很明显,这就像一份“如果其他声明”。它不是从右到左计算的。在我看来,这是从左到右的联想。
我做布尔人是为了证明这一点。这表明它不是正确的联想。(我可能不明白什么是正确的联想。)如果它是正确的联想,它会像这样工作,这是一个答案,给了我:
因为这个运算符是正确关联的,所以您的代码的工作方式是:
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.我试着证明这个,就像这样:
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语句之后,所有其他语句都是不可访问的。
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;
}
}原来的答案是错的吗?正确的结合意味着什么?
发布于 2015-11-26 12:51:27
由于三元条件运算符在运算符优先级表中有自己的位置(即没有其他运算符具有与其完全相同的优先级),因此关联规则仅适用于从另一个操作符中消除条件运算符的歧义。
从右到左的结合意味着隐式括号在最右边的三元附近。
那是,
a ? b : c ? d : e
等于
a ? b : (c ? d : e)。
associativity是一个有用的链接。
发布于 2015-11-26 13:01:13
相联性和执行顺序是相关的,但并不完全相同。
相联性不受任何执行的影响--它是在数学中定义的,它完全由纯函数构成,所以“执行顺序”对结果没有影响。
在C#中,三元操作符中的执行顺序非常简单:
你可以把联想规则想象成“父母在哪里”。
考虑到这一点:
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;
}评估结果与简单三元相同:
ab;否则继续cd;否则计算并返回e这应该清楚地表明执行的关联性和执行顺序如何工作。这样我们就可以完成这次旅行,并解释你的例子。
我们有一系列嵌套条件:
a ? b ? c ? 0 : 1 : 2 : 3结合性在这里是如何应用的?没有,这里没有联合操作!你要做的是:
a ? (b ? (c ? 0 : 1) : 2) : 3没有其他方法来放置父类--这是解析操作符的唯一可能方法。
由于三元运算符是三元的,这有点难理解,但当您将其重写为函数时(例如,“非内联运算符”),就会变得更加明显:
var f = (a, b, c) => a ? b : c;
f(a, f(b, f(c, 0, 1), 2), 3);没有歧义--没有其他方法来解析这个表达式。
使用二进制运算符显示相联性要简单一些,因此请考虑以下场景:
a - b - c如果你不知道-的结合性,你可以看到两种不同的方法来放置父母-- (a - b) - c和a - (b - c),这可以给出两个不同的结果。因此,-不是关联的。
与+相比,它是(完全)关联的-- (a + b) + c和a + (b + c)完全相同。
https://stackoverflow.com/questions/33939059
复制相似问题