两个布尔值的理想 If 语句结构

4

我不太确定应该搜索什么 - 但是如果可能的话,我正在寻找一种优雅的方法来构建一个if语句,该语句使用两个布尔值,并且可以轻松地输出所有四种可能性。

变量:

bool a = true;
bool b = true;

我不确定在检查否定情况后是否存在最佳实践,然后继续等等。

非常匆忙地编写的示例:

if(!a && !b)
{
   //Output (-,-)
}
else
{
   if(a || b)
   {
       if(a)
       {
           //Output (+,-)
       }
       else
       {
           //Output (-,+)
       }
   }
   else
   {
       //Output (+,+)
   }
}

抱歉我太在意格式( { } )了,感谢任何建议!

7个回答

4

这取决于您如何定义“优雅”。

因此,我将使用自己的定义:

  1. 对称的。
  2. 易读的。
  3. 避免不必要的复杂性。

考虑到这一点,我只会选择:

if( a ) {
  if( b ) {
     ...
  } else {
     ...
  }
} else {
  if( b ) {
     ...
  } else {
     ...
  }
}

虽然它不比你的想法简洁,但至少它清晰地表达了意思。

话虽如此,我认为像这样的控制结构非常可疑。您可能可以:

  1. 如果您只是将值分配给变量,则可以使用(二维)常量数组来获取值。
  2. 重新组织整个块以避免重复调用类似的代码。也许可以将其中一个检查因素提取到函数中。
  3. 您可能根本不需要两个单独的布尔值,具有4个可能值的单个变量会更具表现力,然后您可以使用switch/case结构。

3

我不完全确定你的意思... 你是想让一个 if 语句覆盖所有四种可能性吗?

如果是这样,这里有一种简单的方法:

if (a && b)
    // Output (+, +)
else if (!a && b)
    // Output (-, +)
else if (a && !b)
    // Output (+, -)
else
    // Output (-, -)

如果这不是您要找的内容,请告诉我,我会删除这篇文章。

我想到这个问题会出现 - 因为这是一个完全可行/易于阅读的解决方案。我只是想知道还有哪些其他方法可以实现这个目标(也许不需要手动测试所有组合)。 - Rion Williams

2
理想情况下,您可以完全不使用if...
case a, b of
  true, true => "+,+"
| false, true => "-,+"
| true, false => "+,-"
| false, false => "-,-"

如果你想违反公司的C编码标准并测试C编译器的优化器,你可以在C语言中近似实现以下代码:

switch (((!!a) * 2) + (!!b))
{
  case 3: \\ "+,+"
    break;
  case 2: \\ "+,-"
    break;
  case 1: \\ "-,+"
    break;
  case 0: \\ "-,-"
    break;
}

2
@M.Sameer 不完全准确,至少在C语言中不是这样的。如果a非零,则 !!a == 1;如果a为零,则 !!a == 0 - biziclop

1
静态分析可以用来改进@templatetypedef的答案。我个人更喜欢这种方法,因为它比@biziclop的答案更简洁。
    if (a && b) {
      // Output (+, +)
    } else if (a) {
      // Output (+, -)
    } else if (b) {
      // Output (-, +)    
    } else {
      // Output (-, -)
    }

可以推广到两个以上的变量,例如:

if (a && b && c)  {

} else if (a && b) {

} else if (a && c) {

} else if (b && c) {

} else if (a) {

} else if (b) {

} else if (c) {

} else {

}

0
以下代码片段难以维护。不过无论如何。
Output(strings[(a ? 2 : 0) + (b ? 1 : 0)])

0

我想你需要这个:

char table[2] = {'-','+'};
printf("(name%c,id%c)",table[!!name],table[!!id]);

干杯!


0
我尝试了以下作为示例,看起来是有效的:
result = (name & id) ? "(+,+)" : 
         (!name & !id) ? "(-,-)" : 
         (name & !id) ? "(+,-)" : "(-,+)";

然而 - 我不知道是否有任何方法可以输出值,而不是设置一个变量来包含它们(使用三元运算符)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接