关于double 5/2=2.00000

曾经有小伙伴问过关于C语言”/“运算符的问题,简单的来说一下。

关于double 5/2=2.00000 的问题

我们先贴代码

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main ()
{
double n;
int a = 5;
int b = 2;
n = a/b;
printf ("%lf",n);
return 0;
}

可以用python跑一下结果

1
2
3
4
5
6
7
8
>>> a = 5/2
>>> print a
2
>>>
>>> float(a)
2.0
>>> float(5/2)
2.0

那么问题来了,为什么会得到2.0的结果。

有同学说:”/“就是取整的符号。

1
2
3
4
>>> float(5.0/2)
2.5
>>> float(5/2.0)
2.5

计算结果说明了“/“并不能单纯地理解成取整符号

我们知道,计算机有个栈机制

对于栈机制,简单说一下。计算机的堆栈是从下向上的,堆栈像一个盒子,只有一个出口,并且是按顺序进行读写,所以最先进入堆栈的被最后读取,最后进入堆栈的被首先读取

然后,当代码执行到”n = a/b”时,计算机会首先读取”a/b”部分,然后把计算结果赋值给”n”。

我们可以暂时理解成:因为我们的”a”,”b”都定义为”int”形式,所以得到的结果为2,所以”n = 2”,然后转化成”double”就是”n = 2.000000”。

但是如果我们把”a”或者”b”的其中一个定义成”double”型会怎么样。

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main()
{
double n;
int a = 5;
double b = 2;
n = a / b;
printf("%lf", n);
return 0;
}

最后的输出结果是”n = 2.500000”。

可见,当代码执行到”n = a/b”时,”a/b”得到的结果是一个浮点数。

那么现在的问题是:如何判断计算”a/b”计算之后所得到的值的类型

以下为所讲重点

从编译器的角度来讲,在计算”a/b”时,编译器会读取”a”和”b”的数据类型,根据”a”和”b”的数据类型来定义计算所得值(n)的类型,再根据用户所定义的所得值(n)的类型对所得值进行修改。

当”a”和”b”均定义为”int”时,计算所得值为”int”类型,所以在计算”a/b”之后,”n = 2”,然后根据我们定义的”n”的类型(double),将”n = 2”修改为”n = 2.000000”。

当”a”和”b”被定义为”int”和”double”时,编译器会在计算”a/b”时将所得值定义为”double”,所以我们得到的是”n = 2.500000”。

也就是说,当编译器进行计算时,最终所得值与参与计算的值的数据类型有必然联系

后记

可能说的有些片面,如果多实践一下应该是可以理解的。C语言博大精深,我好菜啊。。。

文章目录
  1. 1. 关于double 5/2=2.00000 的问题
    1. 1.1. 以下为所讲重点
  2. 2. 后记
,