【问题标题】:Ideal If statement structure for two boolean values两个布尔值的理想 If 语句结构
【发布时间】:2011-07-16 04:15:06
【问题描述】:

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

变量:

bool a = true;
bool b = true;

我不确定是否有最好的做法来检查是否有消极性 - 然后继续等等。

写得很仓促的例子:

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

对不起所有的鸥翼( { } )我有点喜欢格式化。无论如何 - 感谢您的任何建议!

【问题讨论】:

    标签: language-agnostic if-statement logic


    【解决方案1】:

    这取决于你如何定义优雅。

    所以我要按照我自己的定义去:

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

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

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

    它并不比你的想法更冗长,但至少它的意思很清楚。

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

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

    【讨论】:

      【解决方案2】:

      我不完全确定我明白你在问什么......你只是想要一个 if 声明来涵盖所有四种可能性吗?

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

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

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

      【讨论】:

      • 我认为这会出现 - 因为它是一个完全可行/易于阅读的解决方案。我只是想知道完成此任务的其他方法可能是什么(也许无需手动测试所有组合)。
      【解决方案3】:

      理想情况下你根本不会使用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;
      }
      

      【讨论】:

      • @M.Sameer 不完全是,至少在 C 中不是。!!a == 1 如果 a 不为零,!!a == 0 如果 a 为零。
      【解决方案4】:

      静态分析可用于改进@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 {
      
      }
      

      【讨论】:

        【解决方案5】:

        跟随 sn-p 是不可维护的。反正

        Output(strings[(a ? 2 : 0) + (b ? 1 : 0)])
        

        【讨论】:

          【解决方案6】:

          我尝试了以下示例,似乎可行:

          result = (name & id) ? "(+,+)" : 
                   (!name & !id) ? "(-,-)" : 
                   (name & !id) ? "(+,-)" : "(-,+)";
          

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

          【讨论】:

            【解决方案7】:

            我想你想要这个:

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

            干杯!

            【讨论】:

              猜你喜欢
              • 2012-02-09
              • 2013-03-01
              • 2013-03-26
              • 2015-12-21
              • 2021-08-03
              • 1970-01-01
              • 1970-01-01
              • 2016-11-20
              • 1970-01-01
              相关资源
              最近更新 更多