【问题标题】:Can you use 2 or more OR conditions in an if statement? [duplicate]您可以在 if 语句中使用 2 个或更多 OR 条件吗? [复制]
【发布时间】:2012-02-05 13:49:48
【问题描述】:

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

#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】:

虽然您可以(正如其他人所展示的那样)重新编写测试以实现您想要的,但我认为也值得考虑几个替代方案。一个是 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
【解决方案3】:

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

#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;
}

【讨论】:

  • 这是合法的语法——可能不是他真正想要的
  • 我应该澄清一下。他所期望的行为不正确。
【解决方案4】:
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)。

【讨论】:

    【解决方案5】:
    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

    【讨论】:

      【解决方案6】:
      number == 1 || 2 || 3
      

      等价于

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

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

      1
      

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

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

      【讨论】:

        【解决方案7】:

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

        #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();
            }
        }
        

        【讨论】:

          【解决方案8】:

          你必须像这样比较

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


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

          【讨论】:

            【解决方案9】:

            您似乎想在此链接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
            

            【讨论】:

              猜你喜欢
              • 2021-09-02
              • 2019-12-17
              • 2014-08-13
              • 2019-03-01
              • 1970-01-01
              • 2012-12-15
              相关资源
              最近更新 更多