我在一个简单的程序上遇到了麻烦,该程序将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是偶数且a0,否则这没有什么意义,并且很少会是真的。

与乘法有关的所有运算(*/%)具有相同的优先级,并且从左到右进行处理,因此
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/

10-09 02:59