【问题标题】:Can you use 2 or more OR conditions in an if statement? [duplicate]您可以在 if 语句中使用 2 个或更多 OR 条件吗?
【发布时间】:2021-09-02 19:38:17
【问题描述】:

在论坛上提问之前,我尝试自己对此进行测试,但我用于测试的简单代码似乎不起作用。

#include <iostream>
using namespace std;

int main() {
cout << "Enter int: ";
int number;
cin >> number;
if (number==1||2||3) {
    cout << "Your number was 1, 2, or 3." << endl;
}
else if (number==4||5||6) {
    cout << "Your number was 4, 5, or 6." << endl;
}
else {
    cout << "Your number was above 6." << endl;
}
return 0;
}

它总是返回第一个条件。我的问题是,是否有可能有超过 2 个 OR 条件?还是我的语法不正确?

【问题讨论】:

  • 您的语法不正确。 if(number == 1 || number == 2 || number == 3)
  • 我想看到一个例子,即使有两个也可以,这永远不会。您对评估顺序有何期望,if(2) 会做什么?
  • @MartinKristiansen 使用演绎技巧,你可能会猜到我想要输入 1、2 或 3 来返回第一个条件;输入 4、5 或 6 以返回第二个;并输入任何其他内容以返回第三个条件。与其抨击明显不熟悉 C++ 的人,不如建议一种更好的方法来编写我的代码。

标签: c++ conditional-statements


【解决方案1】:

您需要以不同的方式编写测试代码:

if (number==1 || number==2 || number==3) {
    cout << "Your number was 1, 2, or 3." << endl;
}
else if (number==4 || number==5 || number==6) {
    cout << "Your number was 4, 5, or 6." << endl;
}
else {
    cout << "Your number was above 6." << endl;
}

你这样做的方式,第一个条件被解释为好像是这样写的

if ( (number == 1) || 2 || 3 ) {

逻辑或运算符 (||) 定义为在左侧为真或左侧为假而右侧为真时计算为真值。由于2 是真值(3 也是如此),因此无论number 的值如何,表达式的计算结果都为真。

【讨论】:

  • 你不是在|| 周围加空格吗?读起来有点难,你不觉得吗? :-)
  • 不,我不在任何运算符(+、-、||、
  • 或更好:number &gt;= 1 &amp;&amp; number &lt;= 3。顺便说一句,放在空格里。
  • 无论您如何格式化代码,总会有人喜欢不同的方式。我通常更喜欢==|| 等周围的空格,但不要在if( 之间放置空格。我也没有将{ 放在行尾,但它并没有像以前那样困扰我。 :)
【解决方案2】:

您似乎想在此链接ors:

if (number==1||2||3)

上面应该写成

if (number==1 || number==2 || number==3)

或者,通过检查number 是否在[1,3] 范围内:

if (number>=1 && number<=3)

如果您想链接多个ors(即范围),您可以使用折叠表达式 (C++17) 创建一个辅助模板函数:

例子:

#include <functional> // std::equal_to
#include <iostream>

// matching exactly two operands
template<class T, class BinaryPredicate>
inline constexpr bool chained_or(const T& v1, BinaryPredicate p, const T& v2)
{
    return p(v1, v2);
}

// matching three or more operands
template<class T, class BinaryPredicate, class... Ts>
inline constexpr bool chained_or(const T& v1, BinaryPredicate p, const T& v2,
                                 const Ts&... vs)
{
    return p(v1, v2) || (chained_or(v1, p, vs) || ...); // fold expression
}

int main() {
    // check if 6  is equal to any of the listed numbers
    if constexpr (chained_or(6, std::equal_to<int>(), 1,3,4,6,9)) {
        std::cout << "6 - true\n";
    }

    // check if 7 is any of the listed numbers
    if constexpr(chained_or(7, std::equal_to<int>(), 1,3,4,6,9)) {
        std::cout << "7 - true\n";
    }
}

chained_or 被实例化时,折叠表达式将展开为:

(6 == 1 || 6 == 3 || 6 == 4 || 6 == 6 || 6 == 9) // true

(7 == 1 || 7 == 3 || 7 == 4 || 7 == 6 || 7 == 9) // false

【讨论】:

    【解决方案3】:

    你必须像这样比较

    if (number == 1 || number ==2 || number == 3){...} 每次比较时都必须输入 number ==


    专业提示 始终初始化变量,int number{0}; 不要在没有初始化它们的情况下声明 var。

    【讨论】:

      【解决方案4】:

      对于一长串选项,您可能希望将所有选项放在静态数组或向量中,并检查它们是否包含选项:

      #include <iostream>
      #include <vector>
      #include <algorithm>
      using namespace std;
      
      void menu_prompt(vector<int> list) {
          static vector<char> menuOptions{'P', 'A', 'M', 'S', 'L', 'Q', 'p', 'a', 'm', 's', 'l', 'q'};
      
          char user_input{};
          do {
              cout << "P - Print numbers" << endl;
              cout << "A - Add a number" << endl;
              cout << "M - Display mean of the numbers" << endl;
              cout << "S - Display the smallest number" << endl;
              cout << "L - Display the largest number" << endl;
              cout << "Q - Quit" << endl << endl;
              cout << "Enter your choice: " << endl;
      
              cin >> user_input;
          } while (std::find(menuOptions.begin(), menuOptions.end(), user_input) == menuOptions.end());
          if (user_input == 'P' || user_input == 'p') {
              //user_choice_print_numbers(list);
          }
          else if (user_input == 'A' || user_input == 'a') {
              //user_choice_add_numbers(list);
          }
          else if (user_input == 'M' || user_input == 'm') {
              //user_choice_mean_numbers(list);
          }
          else if (user_input == 'S' || user_input == 's') {
              //user_choice_smallest_numbers(list);
          }
          else if (user_input == 'L' || user_input == 'l') {
          //  user_choice_largest_number(list);
          }
          else if (user_input == 'Q' || user_input == 'q') {
              //user_choice_quit();
          }
      }
      

      【讨论】:

        【解决方案5】:

        虽然您可以(正如其他人所展示的那样)重新编写测试以实现您想要的,但我认为也值得考虑几个替代方案。一个是 switch 语句:

        switch (number) { 
            case 1:
            case 2:
            case 3:
                cout << "Your number was 1, 2, or 3." << endl;
                break;
            case 4:
            case 5:
            case 6: 
                cout << "Your number was 4, 5, or 6." << endl;
                break;
            default:
                cout << "Your number was above 6." << endl;
        }
        

        就个人而言,我可能会做这样的事情:

        char const *msgs[] = {
            "Your number was 1, 2, or 3.\n",
            "Your number was 4, 5, or 6.\n"
        };
        
        if (number < 1 || number > 6)
            std::cout << "Your number was outside the range 1..6.\n";
        else
            std::cout << msgs[(number-1)/3];
        

        请注意,就目前而言,您的代码表示 0 和所有负数都大于 6。我在第一个示例中没有处理这个问题,但在第二个示例中对其进行了修复。

        【讨论】:

        • 对。对于我的应用程序,尽管数字的评估结果并不重要,因为它们始终在 1-9 的范围内,所以只需使用第一个示例即可。另外,如果我使用第二个示例,我会觉得我在偷窃,因为我不是自己写的。 :P
        【解决方案6】:
        number == 1 || 2 || 3
        

        等价于

        ((number == 1) || 2) || 3)
        

        由于|| 运算符的结果是1,如果它的左操作数或右操作数不同于0,则上面的表达式总是计算为

        1
        

        所以你真正想要的是下面的表达式

        number == 1 || number == 2 || number == 3
        

        【讨论】:

          【解决方案7】:
          if (number > 0 && number < 4) {
              cout << "Your number was 1, 2, or 3." << endl;
          }
          else if (number > 3 && number < 7) {
              cout << "Your number was 4, 5, or 6." << endl;
          }
          else if(number > 0) {
              cout << "Your number was above 6." << endl;
          }
          

          我的语法不正确吗?

          是的,请知道您所经历的事情之所以发生,是因为 (2) 和 (3) 的计算结果为真。相反,你会做 number == 1 ||数字 == 2 ||数字 == 3

          【讨论】:

            【解决方案8】:
            if (number==1||2||3)
            

            这段代码可以加括号

            if ((number==1) || (2) || (3))
            

            或者换句话说if(number == 1 || true || true),总是导致true。逐一比较 (number == 1 || number == 2 || number == 3) 或与范围比较 (number &gt;= 1 &amp;&amp; number &lt;= 3)。

            【讨论】:

              【解决方案9】:

              尝试将它们全部分离出来。我很确定你的语法不正确

              #include <iostream>
              using namespace std;
              
              int main() {
              cout << "Enter int: ";
              int number;
              cin >> number;
              if ((number==1)||(number==2)||(number==3)) {
                  cout << "Your number was 1, 2, or 3." << endl;
              }
              else if ((number==4)||(number==5)||(number==6)) {
                  cout << "Your number was 4, 5, or 6." << endl;
              }
              else {
                  cout << "Your number was above 6." << endl;
              }
              return 0;
              }
              

              【讨论】:

              • 这是合法的语法——可能不是他真正想要的
              • 我应该澄清一下。他所期望的行为不正确。
              猜你喜欢
              • 2012-02-05
              • 2014-08-13
              • 2019-03-01
              • 1970-01-01
              • 2021-11-24
              • 2015-01-08
              相关资源
              最近更新 更多