您可以在 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 >= 1 && number <= 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 >= 1 && number <= 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】:您似乎想在此链接or
s:
if (number==1||2||3)
上面应该写成
if (number==1 || number==2 || number==3)
或者,通过检查number
是否在[1,3]
范围内:
if (number>=1 && number<=3)
如果您想链接多个or
s(即非范围),您可以使用折叠表达式 (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 条件吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章