Kra*_*nil 1 c++ standards visual-c++ c++11
我在 C 和 C++ 上编程已经有一段时间了,并且总是确信双除 int 会得到 double,或者双除 int 也会得到 double(只有 int 除以 int 才会得到 int),并且与加法相同。我正在做我的作业,并确信1 + (f*f + 10) / k, where fisdouble和kisint总是返回双倍。我在mac上使用g++ -std=gnu++11命令(所以它可能是clang编译器)并且我通过了测试(结果我确实得到了浮点数),但我的老师说它不确定它是否是浮点数(他使用的是windows)。该行为平台特定吗?是否有任何 C++ 标准描述 int 除法上的 double ?谢谢你!我的代码:
#include <iostream>
using namespace std;
int main() {
int N;
double f, P = 0;
cin >> N >> f;
for (double k = 1; k <= N; k++){
P += 1 + (f*f + 10) / k;
}
cout << P;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
来自 C++20 标准草案[expr.arith.conv]:
许多期望算术或枚举类型操作数的二元运算符会以类似的方式导致转换并产生结果类型。目的是产生一个通用类型,这也是结果的类型。这种模式称为通常的算术转换,其定义如下:
- (1.1) 如果任一操作数是作用域枚举类型,则不执行任何转换;如果另一个操作数没有相同的类型,则表达式的格式错误。
- (1.2) 如果其中一个操作数为 long double 类型,则另一个操作数应转换为 long double。
- (1.3) 否则,如果任一操作数为 double,则另一个操作数应转换为 double。
- (1.4) 否则,如果其中一个操作数是 float ,则另一个操作数应转换为 float。
- (1.5) 否则,应在两个操作数上执行积分提升 ([conv.prom])。56 然后应将以下规则应用于提升的操作数: ...
至少自 C++11(这是我检查过的最旧的版本)以来,这一段没有任何根本性的改变,所以你的老师需要做一些解释。