C++ 表达式中应用的转换内容(双精度到整数)

C++ 表达式中应用的转换内容(双精度到整数),c++,implicit-conversion,C++,Implicit Conversion,中位数计算中有一个表达式: auto iter1 = std::next(first, floor(size/2) - 1 ); double result = *iter1 + *(iter1 + 1)) / 2; double result = *iter1 + *(iter1 + 1)) / 2; 其中迭代器下的值的类型为int 预期结果,例如: 1.5=1+2/2 但是,在值1和2的情况下,结果是1,看起来像是到int的隐式转换 请解释一下,规则是什么还是我的误解?在第二个表达式

中位数计算中有一个表达式:

auto iter1 = std::next(first, floor(size/2) - 1 );
double result  = *iter1 + *(iter1 + 1)) / 2;
double result  = *iter1 + *(iter1 + 1)) / 2;
其中迭代器下的值的类型为int

预期结果,例如:

1.5=1+2/2

但是,在值1和2的情况下,结果是1,看起来像是到int的隐式转换

请解释一下,规则是什么还是我的误解?在第二个表达式double result=*iter1+*iter1+1/2;中应用:根据运算符优先级,首先对*iter1+1/2进行评估;并且,由于/运算符的操作数都是整数,因此子表达式将导致。然后将整数除法的结果添加到*iter1

中位数计算中有一个表达式:

auto iter1 = std::next(first, floor(size/2) - 1 );
double result  = *iter1 + *(iter1 + 1)) / 2;
double result  = *iter1 + *(iter1 + 1)) / 2;
因为右边表达式的常见类型是int,所以不需要。至少有一个替身可以解决你的问题。还要注意我为适合您的示例而添加的括号

double result  = (*iter1 + static_cast<double>(*(iter1 + 1))) / 2.0;
在第二个表达式中,double result=*iter1+*iter1+1/2;:根据运算符优先级,首先对*iter1+1/2进行评估;并且,由于/运算符的操作数都是整数,因此子表达式将导致。然后将整数除法的结果添加到*iter1

中位数计算中有一个表达式:

auto iter1 = std::next(first, floor(size/2) - 1 );
double result  = *iter1 + *(iter1 + 1)) / 2;
double result  = *iter1 + *(iter1 + 1)) / 2;
因为右边表达式的常见类型是int,所以不需要。至少有一个替身可以解决你的问题。还要注意我为适合您的示例而添加的括号

double result  = (*iter1 + static_cast<double>(*(iter1 + 1))) / 2.0;

iter1是什么?另外,/2.f.1+2结果的可能副本已经有int类型,不需要隐式转换。我没有看到任何强制转换。大小的类型是什么?iter1的类型是什么?iter1是什么?另外,/2.f.1+2结果的可能副本已经有int类型,不需要隐式转换。我没有看到任何强制转换。大小的类型是什么?*iter1的类型是什么?我将转换一个取消引用的迭代器,这样也可以避免求和中可能出现的溢出问题。@MatteoItalia,Yeap。很好的关注。修正了。我把它改成了我认为应该是括号的东西。如果你不同意,请回复。@ AndoLyg给出,OP的例子,我同意。它看起来很清楚,但我想再多读一点,有人能提供我对C++规则的描述吗?谢谢,我将转换一个取消引用的迭代器,这样您也可以避免求和中可能出现的溢出问题。@MatteoItalia,Yeap。很好的关注。修正了。我把它改成了我认为应该是括号的东西。如果你不同意,请回复。@ AndoLyg给出,OP的例子,我同意。它看起来很清楚,但我想再多读一点,有人能提供我对C++规则的描述吗?非常感谢。