算术计算异常

问题描述

我试图解决 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. 没有括号:

    enter image description here

  2. 带括号:

    enter image description here

这是什么魔法?

编辑:

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

  • answers[i] = (a - 32) * 5/9;
  • answers[i] = (a - 32) * (5/9);

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

解决方法

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

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从左到右 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 等)。如果您确实希望将结果作为整数,您可能仍然希望将计算作为浮点数进行,并且您通常通过将常量之一设置为浮点类型(如 5.0 / 9)来隐式执行此操作。