C++11 何时相对于运算符优先级进行算术类型转换
When does C++11 do arithmetic type conversions relative to operator precedence?
如果我有以下代码:
double compute(double val1,
int32_t val2,
int32_t val3,
int32_t val4) {
return val1 + val2 * val3 * val4;
}
C++11 语言如何指定执行乘法? 例如,根据运算符优先级,val1
、val2
和 val3
是否乘以 32 位整数,可能溢出,然后转换为双精度,或者它们是乘以双精度?
总的来说,标准在这个问题上到底说了什么? 在C++的后续版本中它是否发生了变化(例如,C++17)?
表达式
val1 + val2 * val3 * val4
具有 double
的类型,但乘法部分的类型为 int32_t
。 如果我们应用如何评估的规则,我们有
val1 + (val2 * val3 * val4)
由于乘法具有更高的优先级,因此将在不考虑val1
类型的情况下对其进行计算,并且由于所有操作数都具有相同的类型,因此结果类型将与操作数相同。 然后将该结果转换为double
并添加到val1
。 此行为在任何版本的C++中都没有更改。
要使乘法发生double
您需要将val2
或val3
转换为双精度,这将使整个乘法部分被评估为double
。 那看起来像
val1 + (static_cast<double>(val2) * val3 * val4)
不需要括号,但我喜欢用它们来显示分组
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将Windows产品类型转换为名称?
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- C++11 何时相对于运算符优先级进行算术类型转换
- 隐式类型转换优先级是如何确定的
- 在返回中C++类型转换优先级