我今天正在玩C ++,这是我在做一些测试后发现的:
#include <iostream>
using namespace std;
int main()
{
int myInt = 100;
int myInt2 = myInt + (0.5 * 17); // the math inside the parentheses should go first
int difference = myInt2 - myInt; // get the difference of the two numbers
cout << difference << endl; // difference is 8
}
输出为8
#include <iostream>
using namespace std;
int main()
{
int myInt = 100;
int myInt2 = myInt - (0.5 * 17); // the math inside the parentheses should still go first
int difference = myInt - myInt2; // get the difference of the two numbers
cout << difference << endl; // difference is 9?
}
输出是9?
所以根据我的第一个代码示例,0.5 * 17 = 8,但根据我的第二个代码示例,0.5 * 17 = 9.我知道如果没有括号我会得到相同的结果,但我使用它们帮助说明我在代码中做了什么。
为了帮助缩小问题范围,我尝试了这个:
#include <iostream>
using namespace std;
int main()
{
int myInt = 100;
int myInt2 = 0.5 * 17; // use a variable instead of parentheses
int myInt3 = myInt + myInt2;
int difference = myInt3 - myInt; // get the difference of the two numbers
cout << difference << endl; // difference is 8
}
输出为8
#include <iostream>
using namespace std;
int main()
{
int myInt = 100;
int myInt2 = 0.5 * 17; // continue using a variable
int myInt3 = myInt - myInt2;
int difference = myInt - myInt3; // get the difference of the two numbers
cout << difference << endl; // difference is 8 again!
}
输出再次为8!
所以我的问题是,如果括号中的数学总是先出现,那为什么我会得到不同的结果呢?前两次试验不应该与后两次试验的结果相同吗?我应该提到的另一件事是我和其他十进制数字(如0.1和0.3)有相同的结果。
答案 0 :(得分:3)
表达式0.5 * 17
由于其组件之一0.5
是浮点而导致浮点值。
但是,当您将一个浮点数(如8.5
)分配给一个整数时,它的被截断到8
。并且,要明确这一点,它在分配时被截断。
因此,当您将其分配给整数(a)时,第一个代码段会计算值100 + 8.5 = 108.5
并将其截断为108
。从中减去100
会为您提供8
。
在第二个代码段中,您计算值100 - 8.5 = 91.5
并在分配整数时将其截断为91
。从100
中减去9
会给您8.5
。
最后两个代码段的工作原因是int myInt2 = 0.5 * 17
在100
中被提前,在被添加或减去之前被截断来自100 + 8 = 108
。在这种情况下,100 - 8 = 92
和100
两者都与8
完全不同int myInt2 = myInt + (0.5 * 17);
^ int + double * int
| \ \__________/
| \ |
| \ double
| \_____________/
| |
+- truncate <- double
(尽管有迹象)。
(a)以图形方式思考它可能会有所帮助:
0.5 * 17
8.5
以给出浮点myInt = 100
。108.5
以提供浮点108
。myInt2
时,会将其截断为{{1}}。答案 1 :(得分:1)
.5 * 17不是8,它是8.5
int myInt = 100;
int myInt2 = myInt + (0.5 * 17);
这计算100 +(0.5 * 17)或108.5,它被截断为108。
int difference = myInt2 - myInt;
这会计算108 - 100或8,这是你看到的结果。
在你的第二个例子中:
int myInt = 100;
int myInt2 = myInt - (0.5 * 17);
计算100 - 8.5或91.5,它被截断为91。
int difference = myInt - myInt2;
计算100 - 91或9。
以同样的方式,您可以完成其余的示例。
这是您计算机上非常有用的工具。它被称为&#34;调试器&#34;。使用此工具,您可以逐步浏览任何程序,每行一行,并亲自查看每个步骤中所有变量的值。
答案 2 :(得分:0)
在使用整数进行数学运算时,任何小数部分都会在每个步骤中丢失。
所以.5 * 17给出了8.5,但存储在整数变量中的结果是8,后续步骤中使用了包括输出。