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