Ala*_*ing 20 c++ floating-point type-conversion integer-promotion
是否存在一个浮点数据类型(例如double)确保所有+, - ,*,/,%等数学运算都假定为双操作数?
如果故事比这更复杂,是否有描述这些规则的资源?我不应该问这样的问题,总是明确地转换int到double当公式的结果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?
Run Code Online (Sandbox Code Playgroud)
小智 36
我故意不在我的系统上编译和运行,因为这是可能依赖于编译器的类型.
这不依赖于编译器.C++清楚地定义了这些操作的顺序以及它们的转换方式.
转换的发生方式取决于操作顺序.
double result1 = a + b / d + c; // equal to 4 or to 4.5?
Run Code Online (Sandbox Code Playgroud)
在这个例子中,除法首先发生.因为这是一个int除以double,编译器通过将int转换为double来处理这个问题.因此,结果b / d是双倍的.
C++所做的下一件事是添加a到结果中b / d.这是一个添加到double的int,因此它将int转换为double并添加,从而产生double.同样的事情发生在c.
double result3 = a / b + d; // equal to 4 or to 4.5?
Run Code Online (Sandbox Code Playgroud)
在此示例中,首先处理除法.a并且b都是整数,因此不进行转换.结果为a / bint类型,为0.
然后,将其结果添加到d.这是一个int加一个double,所以C++将int转换为double,结果是double.
即使在此表达式中存在double,a / b也会首先计算double,而double在执行到达double之前没有任何意义.因此,发生整数除法.
我发现促销和转换规则相当复杂.通常类似整数的数字(short,int,long)被提升为浮点数(float,double).但是尺寸差异和符号使事情变得复杂.
有关转换的详细信息,请参阅此问题.
小智 9
是否会
double促进int等式中的每一个double?
不.只有单个操作的结果(关于优先级).
double result1 = a + b/d + c; // equal to 4 or to 4.5?
Run Code Online (Sandbox Code Playgroud)
4.5.
double result2 = (a + b)/d + c; // equal to 3 or to 3.75?
Run Code Online (Sandbox Code Playgroud)
3.75.
double result3 = a/b + d; // equal to 4 or to 4.5?
Run Code Online (Sandbox Code Playgroud)
4.