gpt4 book ai didi

c++ - 与 C++ 中的简单数学混淆

转载 作者:行者123 更新时间:2023-11-30 01:43:17 26 4
gpt4 key购买 nike

我今天在玩 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.5 * 17 产生一个浮点值,因为它的一个组成部分 0.5 是 float 。

但是,当您将 8.5 之类的 float 分配给整数时,它会被截断8 。并且,为了清楚这一点,它在赋值点被截断。

因此第一个代码段计算值 100 + 8.5 = 108.5 并在您将其分配给整数(a) 时将其截断为 108。从中减去 100 然后得到 8

在第二个代码段中,您计算​​值 100 - 8.5 = 91.5 并在分配给整数时将其截断为 91。从 100 中减去它得到 9

最后两个代码段起作用的原因是因为 8.5int myInt2 = 0.5 * 17 中被截断较早之前被添加到 100 或从中减去。在这种情况下, 100 + 8 = 108100 - 8 = 92100 相差 8(尽管有符号)。


(a) 以图形方式思考可能会有所帮助:

int myInt2 = myInt + (0.5    * 17);
^ int + double * int
| \ \__________/
| \ |
| \ double
| \_____________/
| |
+- truncate <- double
  • 先计算0.5 * 17,得到 float 8.5
  • 然后将其与整数 myInt = 100 相加得到 float 108.5
  • 然后在分配给整数 108 时将其截断为 myInt2

关于c++ - 与 C++ 中的简单数学混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38089027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com