【问题标题】:Multiple Ternary operator in c++c++中的多三元运算符
【发布时间】:2013-10-01 22:34:37
【问题描述】:

我对以下场景(C++)有疑问:

说,我有一个 if 条件

if ( a ? b ? c : d : false)
{
    // do something
}
else
{
    // do something else
}

这是我对其工作原理的解释:

If a is true, it checks b. Then,
    - If b is true, the if loop is reduced to if (c)
    - If b is false, the if loop is reduced to if (d)
If a is false, the if loop is reduced to if (false)

我的理解正确吗?
使用这个更好还是多个if/else 检查?

【问题讨论】:

标签: c++ ternary


【解决方案1】:

请在括号中使用它,因为它有助于提高可读性。此外,使用多个三元运算符也没问题。

if ( a ? (b ? c : d) : false)
{
    // do something
}
else
{
    // do something else
}

【讨论】:

  • @mdv:执行顺序发生变化。但它会给你你需要的最终结果。
  • 说我的检查“a”是指针有效性检查,在“b”中我检查指针指向的数据。仅当“a”为真时,即指针有效时,我才需要检查“b”。在这种情况下,顺序变得很重要。没有括号的代码将如何表现?
  • 执行顺序不变。 ?: 仅基于第一个计算第二个和第三个操作数之一。所以括号不会改变执行顺序,只是提高可读性。
【解决方案2】:

是的,你说得对:

If a is true, it checks b. Then,
    - If b is true, the if condition is reduced to if (c)
    - If b is false, the if condition is reduced to if (d)
If a is false, the if condition is reduced to if (false)

但是 if() 不是循环而是条件语句。并且括号中的书写条件使其更具可读性。

if ( a ? (b ? c : d) : false)

或者你可以简化它:

if ( a && (b ? c : d))

【讨论】:

    【解决方案3】:

    我的理解正确吗?

    是的,您的解释是正确的。

    使用这个更好还是使用多个 if/else 检查?

    如你所知的代码:

    if ( a ? b ? c : d : false)
    {
       "Code-1"
    }
    else
    {
       "Code-2"
    }
    

    可以写成:

    if(a){  
      if(b){
        if (c){
           "code-1"
        }
        else{
           "code-2"       
        }
      }
      else{
        if(d){
           "code-1"
        }
        else{
           "code-2"
        }
      }
    }
    else{  
       //then false;       
        "Code-2"
    }
    

    现在你会更喜欢以上两个。其次很长并且包含许多嵌套级别的代码(难以理解和错误)。另外第一个可以提高可读性的代码:

    if ( a ? (b ? c : d) : false) 
    

    正如@ManikandanSigamani 回答的那样。

    正如我所指出的,@WhozCraig 还提供了另一种技术来更好地编写代码if (a && (b ? c : d)),使用支持短路逻辑的&&

    一个好的程序员是一个知道解决问题的技术多于一种的技术,并且知道哪种技术更好。一般来说,短而线性的编码是优选的。在编写小代码时,出错的可能性较小(看起来函数式编程比命令式编程更好)。正如@ManikandanSigamani 和@WhozCraig 建议的那样,可以轻松改进小代码。

    我更喜欢:if (a && (b ? c : d)) 表单!

    【讨论】:

      【解决方案4】:

      虽然它有效,但像这样的嵌套三元运算符很少可读。

      写成

      if ( a && (( b && c ) || d )) {
        // do something
      } else {
        // do something else
      }
      

      恕我直言,它更具可读性,并且比您的原始代码长不了多少。

      【讨论】:

        【解决方案5】:

        您的问题分为两部分,首先是关于语句的行为,然后是关于您是否应该这样做;请允许我告诉你有多少程序员会解决第二个问题。

        想象一下,周六早上 4.30 点,你已经挂了,这段代码中有一个错误,你需要在接下来的 30 分钟内修复它,否则你的工作/业务将面临风险。

        if (a ? b ? c : d : false)
        

        if (a) {
            if (b)
                return c;
            else
                return d;
        } else {
            return false;
        }
        

        if (!a)
            return false;
        if (!b)
            return d;
        return c;
        

        if (a)
            return b ? c : d;
        else
            return false;
        

        哪个是正确的选择?

        -- 编辑--

        使用单字母变量名,看起来很无辜。所以,一些真正的变量名:

        if (application.config.usingUTCTimezone ? system.environment.biosTimezoneIsUTC ? haveNTPServerConfigured : system.time.clockIsSynchronized : false)
        

        if (application.config.usingUTCTimezone ?
            system.environment.biosTimezoneIsUTC ?
                haveNTPServerConfigured : system.time.clockIsSynchronized
            : false)
        

        if (application.config.usingUTCTimezone) {
            if (system.environment.biosTimezoneIsUTC)
                return haveNTPServerConfigured;
            else
                return system.time.clockIsSynchronized;
        } else {
            return false;
        }
        

        if (!application.config.usingUTCTimezone)
            return false;
        if (!system.environment.biosTimezoneIsUTC)
            return system.time.clockIsSynchronized;
        return haveNTPServerConfigured;
        

        if (application.config.usingUTCTimezone)
            return system.environment.biosTimezoneIsUTC ? haveNTPServerConfigured : system.time.clockIsSynchronized;
        else
            return false;
        

        【讨论】:

        • 是的!清晰胜于简洁。
        • 呃,除了第一个选项最差之外,我不确定其他三个中哪个最好?还是您认为后者更好?
        • 似乎最后一个选项是简洁明了,可读性和性能应该比最小化代码行更重要
        • @Federico 我添加了带有真实变量名称的样本以进行对比。 Annecdote:golang 通过不使用三元组来解决这个问题,而是让您使用带有条件的“switch”,从而产生一个相当不错且可读的替代方案。
        猜你喜欢
        • 2011-02-15
        • 2021-10-25
        • 2011-03-16
        • 1970-01-01
        • 1970-01-01
        • 2017-03-09
        • 2012-04-02
        相关资源
        最近更新 更多