我遇到一个简单程序的问题,该程序将乘以2个整数并打印输出,确定它是偶数还是奇数。它还将在开头添加2个整数输入,并在下一行中执行相同操作。乘法工作正常,如果产品是偶数或奇数,则显示。但是,添加不是这样做的,我不明白为什么。这是我的代码:
#include <iostream>
using namespace std;
int main (){
int a, b;
cout << "Please enter an integer: ";
cin >> a;
cout << "Please enter another integer: ";
cin >> b;
if (a*b %2== 0){
cout << "The product of " << a << " and " << b << " is " << (a*b)
<< " and is even." << endl;
}
else {
cout << "The product of " << a << " and " << b << " is " << (a*b)
<< " and is odd." << endl;
};
if (a+b %2== 0){
cout << "The sum of " << a << " and " << b << " is " << (a+b)
<< " and is even." << endl;
}
else {
cout << "The sum of " << a << " and " << b << " is " << (a+b)
<< " and is odd." << endl;
}
return (0);
}
非常感谢任何帮助和解释。谢谢!
答案 0 :(得分:7)
基本上,%
会在+
之前处理,所以您的测试:
if (a+b % 2 == 0)
就像
一样if (a + (b%2) == 0)
除非b
均为且 a
为0
,否则并不是很有意义,并且很少会成为现实。
与乘法(*
,/
,%
)相关的所有操作具有相同的优先级,并且从左到右处理,因此
if (a*b % 2 == 0)
运行正常,如:
if ((a*b) % 2 == 0)
恰好是你真正的意思。
但是,在与添加(+
,-
)相关的操作之前处理这些乘法运算。因此,%
会在+
之前分组,从而导致您的具体问题。
你可能已经了解了学校的操作顺序,例如我被教导BODMAS。相同的规则适用于C ++。
就我个人而言,我发现最好在任何类型的复合表达中使用括号,即使它不是绝对必要的。它可以使代码更容易阅读,而不是试图记住你头脑中的所有规则。所以我更喜欢:
if ((a*b) % 2 == 0) // ...
if ((a+b) % 2 == 0) // ...
即使第一个中的额外括号并非真正需要。
答案 1 :(得分:3)
答案 2 :(得分:1)
可能的操作顺序。
为了确保您的代码按照您的意图行事,您可能希望像这样重写:
if (((a*b) %2)== 0){
cout << "The product of " << a << " and " << b << " is " << (a*b) << " and is even." << endl;
}
else {
cout << "The product of " << a << " and " << b << " is " << (a*b) << " and is odd." << endl;
};
if (((a+b) %2)== 0){
cout << "The sum of " << a << " and " << b << " is " << (a+b) << " and is even." << endl;
}
else {
cout << "The sum of " << a << " and " << b << " is " << (a+b) << " and is odd." << endl;
}
然后,您可以逐步删除括号,直到您确信代码可读但仍然正确。