3

我对以下场景(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检查?

4

5 回答 5

6

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

if ( a ? (b ? c : d) : false)
{
    // do something
}
else
{
    // do something else
}
于 2013-09-26T05:34:21.687 回答
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;
于 2013-09-26T05:53:59.197 回答
2

我的理解正确吗?

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

使用这个更好还是多个 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))形式!

于 2013-09-26T05:51:34.290 回答
1

Yes, you are correct at stating:

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)

but if() is not a loop but a condition statement. and writing condition in parenthesis make it more readable.

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

or you can simplify it:

if ( a && (b ? c : d))
于 2013-09-26T05:43:32.653 回答
0

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

把它写成

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

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

于 2013-09-26T05:52:39.927 回答