c++ - C++11什么时候做相对于运算符优先级的算术类型转换?
问题描述
如果我有以下代码:
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
并且由于所有操作数都具有相同的类型,因此结果类型将与操作数相同。然后将该结果转换为 adouble
并添加到val1
. 这种行为在任何 C++ 版本中都没有改变。
要使乘法发生,double
您需要将其中一个val2
或val3
一个 double 类型转换为 double,这将使整个乘法部分评估为double
. 那看起来像
val1 + (static_cast<double>(val2) * val3 * val4)
不需要括号,但我喜欢用它们来显示分组
推荐阅读
- c# - 创建使用 Peek Lock 模式的 Service Bus Queue Flavor 的 .NET 5.0 Azure 函数
- mongodb - MongoDB 在 Go 中将对象数据作为键值对数组返回
- ruby - 将特定文件类型从本地目录拉到 s3 存储桶
- javascript - 为什么我的自定义异常类类型在抛出实例时会丢失上下文?
- c++ - c++网络客户端\服务器程序,一些步骤
- perl - 需要解释 `~0` 与 `2**64` 有和没有 `use integer`
- javascript - 在对象定义中传播导致“this”中的未定义属性
- javascript - Firestore 数据验证规则不起作用
- data-science - awesome_cossim_topn 函数是否提供余弦相似度而与单词顺序无关?
- c++ - 为什么这个程序在不同的优化标志值下表现不同