我在一个简单的程序上遇到了麻烦,该程序将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);
}
任何帮助和解释将不胜感激。谢谢!
最佳答案
Operator Precedence
基本上,%
在+
之前处理,因此您的测试:
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) // ...
即使实际上并不需要第一个括号。
关于c++ - C++-将两个整数相乘/相加,然后确定它们是偶数还是奇数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34859876/