【问题标题】:Testing multiple boolean values in a single IF statement在单个 IF 语句中测试多个布尔值
【发布时间】:2019-10-03 16:58:42
【问题描述】:

我是一名新手 C++ 程序员,试图测试传递给程序的参数/参数。

可以将多个参数传递给程序,但是我想测试如果传递了某些参数,那么其他参数将变得无效。

例如PGM 接受 arg(1) arg(2) arg(3) arg(4) arg(5) 等等...

如果提供了 arg(1) 和 arg(2),则 arg(3)、arg(4) 和 arg(5) 等...无效,如果还提供了它们,程序应该以错误消息终止以及 arg(1) 和 arg(2)。

我认为使用布尔 IF 测试是检查某些值是否为真/假的好方法。

我在 stackoverflow 上进行了搜索,但没有找到完全包含我正在尝试做的事情的答案。如果有人能指出我正确的方向或提出更有效的方法,我将不胜感激。

我的代码目前如下所示:

bool opt1 = false; 
bool opt2 = false;
bool opt3 = false;
bool opt4 = false;
bool opt5 = false;

  for(int i=1; i<argc; i++)   {
        char *str  = argv[i];
        if      (strcmp (str, "-opt1:")==0) {opt1 = true;}
        else if (strcmp (str, "-opt2:")==0) {opt2 = true;}
        else if (strcmp (str, "-opt3:")==0) {opt3 = true;}
        else if (strcmp (str, "-opt4:")==0) {opt4 = true;}
        else if (strcmp (str, "-opt5:")==0) {opt5 = true;}        
     }

if((opt1) && (opt2) && (~(opt3)) && (~(opt4)) && (~(opt5)) {

      ** DO SOMETHING **

   } else {

       ** DISPLAY ERROR MESSAGE AND USAGE TEXT **

   }

【问题讨论】:

  • 从按位非切换到逻辑非 (!opt3 &amp;&amp; !opt4),但除此之外我看不出有什么问题。您在使用这种方法时遇到问题了吗?
  • 不要与过多的括号混淆,使用!代替~if (opt1 &amp;&amp; opt2 &amp;&amp; !opt3 &amp;&amp; !opt4 &amp;&amp; !opt5)
  • 也许error case对应opt1 &amp;&amp; opt2 &amp;&amp; (opt3 || opt4 || opt5)

标签: c++ if-statement boolean


【解决方案1】:

可能的解决方法是(如果我很好地理解了您的问题):

if(opt1 && opt2) // opt3, opt4 and opt5 are invalid
{
    if(!(opt3 || opt4 || opt5))
    {
        // Do something
    }
    else
    {
        // Display error message because at least opt3 or opt4 or opt5 is provided and not requested
    }
}
else // opt3, opt4 and opt5 are valid
{
    // Do something
}

但我认为在您仍然可以仅使用 opt1opt2 运行进程时,最好忽略过时的参数而不是显示错误。这可能会导致我们使用更简单的代码:

if(opt1 && opt2)
{
    // Do something without using opt3, opt4 and opt5
}
else
{
    // Do something taking into account opt3, opt4 and opt5
}

我希望它是你想要的。

【讨论】:

  • 感谢您的帮助。
【解决方案2】:

一个好的解决方案是使用操作数 !&amp;&amp;
! 表示“不”(或在这种情况下“不正确”),而 &amp;&amp; 结合了两个不同的逻辑比较(在这种情况下、“逻辑测试 1”和“逻辑测试 2”)

这是一个例子:

if((opt1 && opt2)&&(!(opt3||opt4||opt5))){
   /*
     Do something if opt1 and opt2 are true and others are false
   */
}

这实际上与上面@Fareanor 的解决方案相同(第一个解决方案)

【讨论】:

  • 这不一样,因为你不处理 opt1、opt2 和 opt3 有效的情况,所以你不能在一个 if 中测试所有内容。
  • @Fareanor 我刚刚将您的第一个 IF 与它的子 IF 与 ~~~&&~~~ 复合了,这实际上是您的代码,我只是做了一些编辑。
  • @SilverousBlack 不,你不明白。这是不一样的,因为您不处理(opt1 &amp;&amp; opt2) 为假的情况,因此opt3opt4op5 变为有效。这就是原因,因为您不能将所有内容都放在&amp;&amp; 的单个链中
  • if(A &amp;&amp; B){} 等于if(A){if(B){}} 仅当没有else 语句。
  • 啊我明白你的意思@Fareanor。我的意思是我只复合了if(opt1&amp;&amp;opt2) 及其子路径if(!(opt3||opt4||opt5)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 2013-03-03
  • 2012-03-24
  • 2022-01-26
  • 1970-01-01
相关资源
最近更新 更多