C++ 一个double是否会使等式中的每个int都加倍?
存在一种浮点数据类型(例如,C++ 一个double是否会使等式中的每个int都加倍?,c++,floating-point,type-conversion,integer-promotion,C++,Floating Point,Type Conversion,Integer Promotion,存在一种浮点数据类型(例如,double)是否确保所有+、-、*、/、%等数学运算都采用双操作数 如果故事比这更复杂,是否有资源描述这些规则?当等式的结果为double时,我是否应该不问这样的问题并始终明确地将int转换为double。这里是我正在考虑的一些方程式。我故意没有在我的系统上编译和运行,因为这是一种依赖于编译器的类型 int a(1), b(2), c(3); double d(4.); double result1 = a + b/d + c; // equal to 4 or t
double
)是否确保所有+、-、*、/、%等数学运算都采用双操作数
如果故事比这更复杂,是否有资源描述这些规则?当等式的结果为double
时,我是否应该不问这样的问题并始终明确地将int
转换为double
。这里是我正在考虑的一些方程式。我故意没有在我的系统上编译和运行,因为这是一种依赖于编译器的类型
int a(1), b(2), c(3);
double d(4.);
double result1 = a + b/d + c; // equal to 4 or to 4.5?
double result2 = (a + b)/d + c; // equal to 3 or to 3.75?
double result3 = a/b + d; // equal to 4 or to 4.5?
一个double
是否将等式中的每个int
提升为double
否。仅为单个操作的结果(关于优先级)
4.5
3.75
4.通常,如果二元运算符的一个操作数是浮点,另一个是整数,则该整数将转换为浮点,结果是浮点 在具有多个子表达式的复合表达式中,使用您可能知道的优先级规则分别处理每个运算符。因此,在
a*b+c*d
中,评估a*b
,评估c*d
,并将结果相加。c*d
中的任何内容对a*b
没有影响,反之亦然
当然,C++很复杂,用户定义的操作符可能有其他行为
定义规则的权威资源是C++标准。标准相当大,技术性很强。您可能更喜欢先检查C标准。有关标准的链接,请参见。任何关于C或C++的好书都应该描述默认类型转换和表达式求值。
我故意没有在我的系统上编译和运行,因为这是一种依赖于编译器的类型
int a(1), b(2), c(3);
double d(4.);
double result1 = a + b/d + c; // equal to 4 or to 4.5?
double result2 = (a + b)/d + c; // equal to 3 or to 3.75?
double result3 = a/b + d; // equal to 4 or to 4.5?
这与编译器无关。C++清楚地定义了它们的转换方式。
转换的方式取决于操作顺序
double result1 = a + b / d + c; // equal to 4 or to 4.5?
在本例中,首先进行除法。因为这是一个整数除以一个double,所以编译器通过将整数转换成double来处理这个问题。因此,b/d
的结果是双精度的
<> > C++下一步就是将代码< < /代码>添加到<代码> B/D 的结果。这是一个添加到double的int,因此它将int转换为double并进行加法,从而生成double。同样的事情也发生在c
上
double result3 = a / b + d; // equal to 4 or to 4.5?
在本例中,首先处理除法a
和b
都是整数,因此不进行转换。a/b
的结果为int类型,为0
然后,将结果添加到d
。这是int加双,所以C++将int转换为双,结果是双.< /p>
即使在这个表达式中存在一个double,a/b
将首先求值,double在执行到达double之前没有任何意义。因此,出现整数除法
我发现晋升和转换规则相当复杂。通常,类似整数的数字(short、int、long)被提升为浮点等价值(float、double)。但大小差异和符号使事情变得复杂
关于转换的细节。
你必须考虑每个操作符的优先级,你必须像解析器一样思考:
double result1 = a + b/d + c; // equal to 4 or to 4.5?
这是一个+(b/d)+c,因为'/'运算符具有最大的优先权。然后,这2个操作首先是什么,这并不重要,因为浮点操作数位于中间,并且它“感染”其他操作数,使它们为两倍。所以它是4.5。p>
double result2 = (a + b)/d + c; // equal to 3 or to 3.75?
这里也一样,就像((a+b)/d)+c,所以a+b是3,3变成一个浮点数,因为它被提升为double,因为是d的股息,是double,所以它是0.75+3,也就是3.75
double result3 = a/b + d; // equal to 4 or to 4.5?
就像(a/b)+d,所以a/b是零,d是4,所以是4。
解析器按照优先顺序执行所有操作,因此您可以准确地知道表达式的结果。考虑操作顺序。如果需要,每个操作都会升级。明白了,所以每个操作都有两个操作数(大多数情况下),如果一个是
float
,另一个是int
,则int
会升级为float。@LexFridman是的,类似于这样。那么a/b*d
呢?
double result2 = (a + b)/d + c; // equal to 3 or to 3.75?
double result3 = a/b + d; // equal to 4 or to 4.5?