【问题标题】:computing the output of ternary operation计算三元运算的输出
【发布时间】:2015-09-05 07:34:45
【问题描述】:

我正在尝试解决这个问题,但找不到正确的方法。

int a = 5, b = 10, c = 20; 
int result = a < b ? a < c ? c : a : b; 
Console.WriteLine(result);

请建议我如何计算这个问题。

【问题讨论】:

  • 您的代码为您提供给定值的正确答案。但是当 ac 时会给出错误的输出
  • 你提到了解决方案但没有提到问题,你想解决什么问题?使用三元运算的 3 个数字之间的最小值?教科书 XY-Problem。

标签: c# ternary-operator


【解决方案1】:

如果你像下面这样写你的表达,那么它会更清楚:

int result = (a < b ) ? ((a < c ) ? c : a) : b;

条件运算符有什么作用?

条件运算符 (?:) 根据布尔表达式的值返回两个值之一。以下是条件运算符的语法。

condition ? first_expression : second_expression;

有关这方面的更多文档,请查看here

现在,让我们在“paper”中进行计算:

a < b

是真的。因此,将评估条件a &lt; c。这个条件也是成立的。因此,结果将等于存储到 c 的值,即 20。仅此而已。

我有一个困惑。我读到三元运算符是正确的 联想。这是否意味着问题中的部分 ((a

根据 C# 规范,conditional operator:

条件运算符是右结合的,这意味着操作 从右到左分组。例如,一个表达式 形成一个?乙:丙? d : e 被评估为 ? b : (c ? d : e)。

【讨论】:

  • 感谢您的回复。我有一个困惑。我读到 三元运算符RIGHT ASSOCIATIVE。这是否意味着在问题中应该首先评估((a &lt; c ) ? c : a) 部分?请解释一下。
【解决方案2】:

我假设你想要一个最大的数字。

int a = 5, b = 10, c = 20; 
int result = a > b ? a > c ? a : c > b ? c : b : b > c ? b : c;
Console.WriteLine(result);

相当于下面的 if-else 条件。我用((...))标识了每个部分

if (a > b)                  //((a > b ?)) a > c ? a : c > b ? c : b : b > c ? b : c
{
    if (a > c)              //a > b ? ((a > c ?)) a : c > b ? c : b : b > c ? b : c
    {
        result = a;         //a > b ? a > c ? ((a)) : c > b ? c : b : b > c ? b : c
    }
    else if (c > b)         //a > b ? a > c ? a ((: c > b ?)) c : b : b > c ? b : c
    {
        result = c;         //a > b ? a > c ? a : c > b ? ((c)) : b : b > c ? b : c
    }
    else
    {
        result = b;         //a > b ? a > c ? a : c > b ? c ((: b)) : b > c ? b : c
    }
}
else if (b > c)             //a > b ? a > c ? a : c > b ? c : b ((: b > c ?)) b : c
{
   result = b;              //a > b ? a > c ? a : c > b ? c : b : b > c ? ((b)) : c
}
else
{
   result = c;              //a > b ? a > c ? a : c > b ? c : b : b > c ? b ((: c))
}

如果您想要 最小 数字,只需否定 &gt;

int result = a < b ? a < c ? a : c < b ? c : b : b < c ? b : c;

【讨论】:

    【解决方案3】:

    你给出的代码:

    int a = 5, b = 10, c = 20; 
    int result = a < b ? a < c ? c : a : b; 
    Console.WriteLine(result);
    

    翻译为:

    int a = 5, b = 10, c = 20; 
    int result;
    if (a < b)
    { 
        if (a < c)
        {
            result = c;
        }
        else
        {
            result = a;
        }
    }
    else
    {
        result = b;
    }
    Console.WriteLine(result);
    

    因此,问题在于,如果 a 小于 b,则不检查 b 与 c,您将结果设置为 b。

    如果你坚持使用三元运算符,条件应该是:

    int result = a < b ? (a < c ? a : (b < c ? b : c)) : (b < c ? b : c);
    

    翻译很简单。如果您想详细说明,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 2016-03-04
      相关资源
      最近更新 更多