评估和截断

Sho*_*rda 3 c truncation

首先发生的是截断还是求值?如果我这样做:

int a = (2+3)*10.5;
Run Code Online (Sandbox Code Playgroud)

一个得到52,但是如果我这样做:

int a = 30 / 4 * 5; 
Run Code Online (Sandbox Code Playgroud)

一个得到35。

因此,首先对表达式求值,然后将其截断。然后,将截断的值用于其他计算吗?'首先计算第二个语句“ 30/4”中的原因,然后将其截断为7。为此的确切规则是什么?文档中的任何内容...我不是在谈论类型转换,在这种情况下只是截断,就像表达式被一个接一个地截断了一样?

小智 5

您是在问一个错误的问题,没有单独的评估和截断步骤之类的事情。如果无法在目标类型中准确表示转换后的值,则截断是类型转换的副作用

double d = 2.5;
int i = d;       // 2.5 is truncated as a side effect of converting to int
Run Code Online (Sandbox Code Playgroud)

因此,您需要了解的是在评估表达式时如何转换操作数。确切的规则有些复杂,在这里我将重点介绍基础知识。通常,对于算术运算符,如果操作数尚未具有相同的类型,则将其中一种转换为可以表示两个值的方式。在第一个示例中:

int a = (2+3)*10.5;
Run Code Online (Sandbox Code Playgroud)

2并且3都属于type int,因此它们只是被添加了-结果(5int再次具有类型。

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

在第二个示例中:

int a = 30 / 4 * 5;
Run Code Online (Sandbox Code Playgroud)

无论304有型int。因此,不进行任何转换,而是直接进行划分。

这里有个要点:将两个整数相除是一个整数除法,它再次导致一个int(here:)7。这不是截断,而是整数除法的定义方式。实际上,您可能是在学校早期就使用了一种称为余数除法的算法来了解这种操作。C语言中有一个“相反”运算模(%),将为您提供该除法的其余部分

因此,这里有7类型的结果,int然后将其乘以5另一个int,因此又一次没有转换-最终结果是35

检查如果写的话会发生什么

int a = 30.0 / 4 * 5;
Run Code Online (Sandbox Code Playgroud)

代替。现在,的第一个操作数/是双精度数,因此4也将转换double为,结果是7.5-又是a double,导致5将转换为a double并产生的最终结果37.5

再次转换为,int因为您将其分配给int和截断yield 37


请注意,根据运算符/的类型,运算符在这里意味着两种不同的含义(实数除法与整数除法)。