算术计算异常

Arithmetic calculation anomaly

我正在尝试解决 this exercise。这是解决方案:

#include <iostream>

using std::cout;
using std::cin;

int main()
{
    int n, a;
    cin >> n;
    int* answers = new int[n]; // allocating memory
    for (int i = 0; i < n; i++)
    {
        cin >> a;
        answers[i] = (a - 32) * 5/9;
    }

    for (int i = 0; i < n; i++)
    {
        cout << answers[i] << ' ';
    }

    cout << '\n';
    delete[]answers; //deallocating memory

    system("pause");
    return 0;
}

现在,请注意我将 answers[i] = (a - 32) * 5/9; 更改为 answers[i] = (a - 32) * (5/9);
这里分别是输出的差异:

  1. 没有括号:

  2. 加上括号:

这是什么魔法?

编辑:

我明白为什么这看起来是重复的。我关心的不是为什么 5/9 输出 0。那不是我关心的。我关心的是以下两个代码之间的区别:

当我不使用括号时,它可以工作。但是,当我使用括号时,它只输出 0。所以,问题是括号运算符在这里发生了什么变化?请仔细阅读问题。

根据 C++ 5 / 9 是 0,因为 5 和 9 是整数。 你应该使用 double.

int main()
{
    int n, a;
    cin >> n;
    int* answers = new int[n]; // allocating memory
    for (int i = 0; i < n; i++)
    {
        cin >> a;
        answers[i] = (a - 32) * 5/9.0; // 9.0 is double
    }

    for (int i = 0; i < n; i++)
    {
        cout << answers[i] << ' ';
    }

    cout << '\n';
    delete[]answers; //deallocating memory

    system("pause");
    return 0;
}

(a - 32) * 5/9;中,表达式是从左到右作为((a - 32) * 5)/9完成的,因为*/same precedence with left-to-right associativity

如果你做 (a - 32) * (5/9) 那么它与 (a - 32) * 0 完全一样,因为 () 中的表达式先完成,而 5/9 是一个整数除法,结果是0. 要进行浮点除法,除法的至少一侧必须是浮点类型。尝试 (a - 32) * (5.0/9)(a - 32) * (5/9.0) 并查看

在括号中,您的计算结果为 (int) 5 / 9,即 0。如果没有括号,您将看到 * 和 / 具有相同运算符优先级的效果,并且它们从左到右进行计算,这意味着表达式将被评估为 ((a - 32) * 5) / 9.

如果您进行小数运算,通常会将值分配给浮点类型(float、double 等)。如果您确实想要将结果作为一个 int,您可能仍然希望将计算作为一个浮点数,并且您通常通过将其中一个常量设为浮点类型(如 5.0 / 9)来隐式地执行此操作。