gpt4 book ai didi

c - 评估和截断

转载 作者:太空狗 更新时间:2023-10-29 15:49:57 25 4
gpt4 key购买 nike

先发生什么,截断还是求值?如果我这样做:

int a = (2+3)*10.5;

a 得到 52,但如果我这样做:

int a = 30 / 4 * 5; 

a 得到 35。

所以一个表达式先求值然后截断。然后截断的值用于其他计算?因为在第二条语句中,“30/4”首先被评估,然后被截断为 7。具体规则是什么?文档中的任何内容...我不是在谈论类型转换,在这种情况下只是截断,比如表达式一个接一个地被截断?

最佳答案

您有点问错了问题,没有单独的评估和截断步骤这样的事情。截断是类型转换的副作用,如果转换后的值不能在目标类型中准确表示,例如

double d = 2.5;
int i = d; // 2.5 is truncated as a side effect of converting to int

所以你必须知道的是在计算表达式时操作数是如何转换的。确切的规则有点复杂,我将在这里重点介绍基础知识。通常,对于算术运算符,如果操作数的类型不相同,则会以某种方式转换其中一个,以便可以表示两个值。在你的第一个例子中:

int a = (2+3)*10.5;

23 都是 int 类型,所以它们只是相加——结果 (5) 再次具有 int 类型。

但是 10.5 的类型是 double。因此,5 也被转换为 double,结果为 52.5。只是因为您将其分配给 int,它会转换回 int,因此必须进行截断。

在你的第二个例子中:

int a = 30 / 4 * 5;

304 的类型都是 int。因此,不进行转换,直接进行除法。

这里有一个要点:两个整数相除是一个整数除法,它再次产生一个int(这里:7)。那不是截断,而是整数除法的定义方式。事实上,您可能在学校早期就使用一种名为 long division with remainder 的算法学习过该操作。 . C 中有一个“相反”的运算模 (%),它会给您该除法的余数

所以,这里你有 int 类型的结果 7,然后乘以 5,另一个 int,因此,同样,没有转换——最终结果是 35

检查如果你写会发生什么

int a = 30.0 / 4 * 5;

相反。现在,/ 的第一个操作数是 double,所以 4 也被转换为 double,结果是 7.5 -- 这又是一个 double,导致 5 被转换为 double 并产生 37.5 的最终结果

这再次转换为 int,因为您将其分配给 int 并且截断产生 37


请注意运算符 / 在这里有两种不同的含义(实数除法与整数除法),具体取决于其操作数的类型。

关于c - 评估和截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49994719/

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