为什么我不能从两个被分割的元素中返回一个double元素

编码相对较新,对于基本的划分有一个问题。 如何来跟随不会返回我认为会的答案:

int a=7; int b=3; double c=0; c=a/b; 

结果是2.3333,但是它只返回2.如果A和B被重新分配为双打,那么答案会变成2.333。 但是肯定是因为C已经是一个双倍的工作了?

如何int / int = double不起作用? 也许是一个奇怪的问题,但它让我感到困惑。

这是因为你正在使用operator/的整数除法版本,它使用2个int s并返回一个int 。 为了使用返回一个doubledouble版本,至less有一个int必须被明确地转换成double

 c = a/(double)b; 

除了很less的例外(我只能想到其中的一个例外),C ++从expression式本身中确定expression式(或子expression式)的全部含义。 你对expression的结果做什么并不重要。 在你的情况下,在expression式a / b ,看不到double的; 一切都是完整的。 所以编译器使用整数除法。 只有一次,它才会考虑如何处理,并将其转化为double

这里是:

a)划分两个int s总是执行整数除法。 所以在你的情况下a/b的结果只能是int

如果你想把ab保留为int ,那么你至less要把它们中的一个加倍: (double)a/b或者a/(double)b或者(double)a/(double)b

b) c是一个double ,所以它可以在assignement上接受一个int值: int自动转换为double并赋值给c

c)记住,在分配时, 首先计算右边的expression式(根据上面的规则(a),而不考虑= )左边的variables, 然后分配给= (根据以上(b))。 我相信这完成了图片。

当你分两个整数时,结果将是一个整数,而不pipe你把它存储在一个double中。

c是一个doublevariables,但是赋值给它的值是一个int值,因为它是由两个int分割得到的,这就给了你“整数除法”(除去余数)。 那么在行c=a/b发生了什么

  1. 评估a/b ,创buildinttypes的临时值
  2. 在转换为doubletypes之后,将临时值赋给c

a/b的值是a/b不考虑上下文的​​情况下确定的(赋值为double )。

在C ++语言中,subexpresison的结果永远不会受到周围环境的影响(除了一些罕见的例外)。 这是语言仔细遵循的原则之一。 expression式c = a / b包含独立的子expression式a / b ,其独立于该子expression之外的任何解释。 该语言不关心你以后将分配结果到一个doublea / b是整数除法。 别的什么都不重要。 您将在语言规范的许多angular落看到这个原则。 这是C ++(和C)的工作原理。

上面提到的exception的一个例子是在函数重载情况下的函数指针分配/初始化

 void foo(int); void foo(double); void (*p)(double) = &foo; // automatically selects `foo(fouble)` 

这是一个赋值/初始化左侧影响右侧行为的上下文。 (另外,引用到数组的初始化可以防止数组types的衰减,这是类似行为的另一个例子。)在所有其他情况下,右侧完全忽略了左侧。

/运算符可用于整数除法或浮点除法。 你给它两个整数操作数,所以它是做整数除法,然后结果被存储在一个双。

这在技术上是依赖于语言的,但几乎所有的语言对待这个主题都是一样的。 当expression式中两种数据types之间存在types不匹配时,大多数语言将尝试在=一侧转换数据,以根据一组预定义的规则匹配另一端的数据。

当将相同types的两个数字(整数,双精度等)分开时,结果将始终是相同的types(因此“int / int”总是会导致int)。

在这种情况下,您有double var = integer result在计算后将整数结果转换为double 在这种情况下分数数据已经丢失。 (大多数语言都会这样做,以防止types不准确而不会引发exception或错误)。

如果你想保持双倍的结果,你会想创build一个double var = double result

最简单的方法是强制等式右边的expression式加倍:

c = a/(double)b

在整数和double之间的区分会导致将整数转换为double(请注意,在进行math运算时,编译器通常会“向上”转换为最具体的数据types,以防数据丢失)。

之后, a会结束双重,现在你有两个双打之间的分工。 这将创build所需的划分和分配。

再次请注意,这是语言特定的(甚至可以是编译器特定的),但是几乎所有的语言(当然,我可以想到的是我的头顶上的所有语言)都以相同的方式处理这个例子。