你可以在if语句中使用2个或更多的OR条件吗?

13

在询问论坛之前,我尝试自己测试了一下,但我的简单代码似乎无法工作。

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

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


9
你的语法有误。if(number == 1 || number == 2 || number == 3) 意为:如果数字等于1、2或3,则执行相应操作。 - Retired Ninja
我想看一个有两个的例子,这样永远不会成功。 你对评估顺序有什么期望,你认为if(2)会做什么? - Martin Kristiansen
3
通过推断技巧,您可能能够猜出我想要输入1、2或3以返回第一个条件;输入4、5或6以返回第二个条件;以及输入其他任何内容以返回第三个条件。与其抨击一个显然对C++很新的人,您可以建议一种更好的编写代码的方式。 - user1116768
9个回答

15

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

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的值影响,总是为真。

2
你不在 || 两边加空格吗?这样看起来有点难读,你觉得呢? :-) - Sergio Tulentsev
不,我不在任何运算符(+、-、||、<等)周围使用空格。我发现加上所有这些空格更难阅读。 - user1116768
1
或者更好的写法:number >= 1 && number <= 3。在两个符号之间加上空格。 - Fred Foo
1
无论你如何格式化代码,总会有人喜欢另一种方式。我通常喜欢在 ==|| 等符号周围加上空格,但不在 if( 之间加空格。我也不会把 { 放在行末,但现在它已经不再让我感到烦恼了。 :) - Retired Ninja

3

虽然你可以(就像其他人展示的那样)重写你的测试来实现你想要的,但我认为也值得考虑一些替代方案。其中一个是使用 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 - user1116768

1

尝试将它们全部分开。我相信你的语法是有误的。

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

3
这是合法的语法——只是可能不是他实际想要的 - Puppy
我应该澄清一下。他期望的行为是错误的。 - schwert

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

这段代码可以加上括号,如下所示:

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

换句话说,if(number == 1 || true || true)总是返回true。可以逐个比较(number == 1 || number == 2 || number == 3)或使用范围比较(number >= 1 && number <= 3)。

0

你必须这样进行比较

if (number == 1 || number ==2 || number == 3){...} 每次比较时,你必须加上number ==


专业提示 始终要初始化变量,int number{0}; 不要声明未初始化的变量。


0

对于一个很长的选项列表,您可能希望将所有选项放入静态数组或向量中,并检查它们是否包含某个选项:

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

0
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) 的值都为 true。相反,你应该这样写:number == 1 || number == 2 || number == 3。

0
number == 1 || 2 || 3

等同于

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

由于 || 运算符的结果是 1,如果其左操作数或右操作数不等于 0,因此上述表达式总是会被计算为

1

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

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

0

看起来你想在这里链接 or

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

应该写成如下:

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

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

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

如果您想链接许多不是范围的or,您可以使用折叠表达式(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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接