我正在用C语言处理这段代码,无法理解为什么对这两个代码得到不同的答案。
第一个写入不带小数点的值
float num2=(5/9);
这给了我如下输出:
0.000000
带小数点
float num2=(5.0/9.0);
这给了我如下输出:
0.555556
这种答案差异背后的工作或理论是什么?
C 将 5 和 9 视为整数。所以它在整数级别进行操作,即 5/9 确实为零。比,此结果分配给 num2 变量。
当你写 5.0/9 时,C 看到 5.0 是一个浮点值,所以它会在浮点数中执行操作,这会给你一个不同的结果,现在这个结果将分配给你的 num2。
你也可以写这个
num2=(float)5/9; //or
num2=5/(float)9; //or
num2=5/9.0;
无论采用哪种方式,您都将一个操作数提升到浮点级别,因此整个操作将在浮点级别进行。
5 和 9 都是整数。所以,5/9
的结果是0
.一切都在整数级别完成,然后放入浮点num2
变量中。为了获得实际的真实答案0.555556
您需要至少有一个数字作为浮点数或实数。5.0/9
或5/9.0
或类型转换其中之一,(float)5/9
也可以工作。
理论是,数字被转换/放大到更高的数据类型(忘记了正确的术语(。就像在5/9.0
的情况下,这里的5
首先转换为5.0
然后完成除法操作。因此,C
在执行右侧操作时不会查看指令的左侧。
C 从"自下而上"计算表达式。
在顶部,声明float num2=(5/9);
包含表达式(5/9)
。该表达式包含5/9
。该表达式使用操作数5
和9
上的运算符/
。这些操作数位于底部。
5
和9
是类型为int
的文本。5/9
使用int
算术进行评估。结果是int
值为零。然后计算括号,因此(5/9)
有效地(0)
,因此它是零。然后将此零转换为float
以用于初始化num2
。
由于表达式是自下而上计算的,因此它们会受到它们使用的操作数的影响。它们不受其所在上下文的影响。表达式最终将分配给float
这一事实不会导致使用float
对其进行计算。