算术计算异常
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);
。
这里分别是输出的差异:
没有括号:
加上括号:
这是什么魔法?
编辑:
我明白为什么这看起来是重复的。我关心的不是为什么 5/9 输出 0。那不是我关心的。我关心的是以下两个代码之间的区别:
answers[i] = (a - 32) * 5/9;
answers[i] = (a - 32) * (5/9);
当我不使用括号时,它可以工作。但是,当我使用括号时,它只输出 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)来隐式地执行此操作。
我正在尝试解决 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 是整数。
你应该使用 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)来隐式地执行此操作。