您可以在 if 语句中使用 2 个或更多 OR 条件吗? [复制]

Posted

技术标签:

【中文标题】您可以在 if 语句中使用 2 个或更多 OR 条件吗? [复制]【英文标题】:Can you use 2 or more OR conditions in an if statement? [duplicate] 【发布时间】: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++ 的人,不如建议一种更好的方法来编写我的代码。 【参考方案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 number0; 不要在没有初始化它们的情况下声明 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

【讨论】:

以上是关于您可以在 if 语句中使用 2 个或更多 OR 条件吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C++ 同时接收 2 个或更多 UDP 消息

Neo4j:匹配多个标签(2个或更多)

Wordpress-2个或更多边栏

在单个 Activity 中使用 2 个或更多 Firebase Realtime DB

进度报告2

我可以为 2 个或更多应用程序进行 QSettings 设置吗?