问题描述
我试图解决 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);
。
这里,分别是输出的差异:
这是什么魔法?
编辑:
我明白为什么这看起来是重复的。我关心的不是为什么 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)来隐式执行此操作。