c++ - 如何在长表达式中提升操作数?

标签 c++ types casting promotions

如果我有如下表达式:

double d = floatVar / intVar;

intVar 将被提升为 float,然后返回的 float 结果将被转换为 double并分配给 d。但是如果我有一个长表达式会发生什么,例如:

double d = floatVar / intVar * shortVar + charVar + intVar2;

是否将所有变量提升为float,然后将返回的float结果转换为double并赋值给d?

此外,如果我有以下内容:

double d = (floatVar / intVar) * shortVar + charVar + intVar2;

intVar 会被转换为float,而shortVarcharVar 会被转换为 >int,然后将 shortVar + charVar + intVar2 返回的 int 结果转换为 float 并乘以返回 (floatVar/intVar)float 结果,这个返回的 float 结果将被转换为 double 并分配给 d?

最佳答案

适用操作顺序。 /*+都是左结合的,/*具有相同的优先级(大于 + 的优先级),因此:

double b = floatVar / intVar * shortVar + charVar + intVar2;

等同于:

double b = (((floatVar / intVar) * shortVar) + charVar) + intVar2;

在每一步中,都会执行适当的转换:intVar 转换为 floatshortVar 转换为floatcharVar转换为floatintVar2转换为float。最终结果提升为 double

另一方面,如果您将 charVar + intVar2 括在括号中以强制该操作首先发生,那么 charVar 将被提升为 int(假设 char 的范围在 int 的范围内,就像您可能遇到的几乎所有系统一样),以及结果总和将转换为 float

关于c++ - 如何在长表达式中提升操作数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28082968/

相关文章:

c++ - 如何在c++中打印n维数组

c++ - 特定共享内存写入操作 (MPI) 的同步

c++ - 通过引用和指针传递参数

arrays - 在 TypeScript 中为特定类型扩展数组

C++11 在运行时索引模板参数包以访问第 N 类型

list - 区 block 链是单链表吗?

date - Kotlin 日期错误 "Type mismatch: inferred type is Date? but Date was expected"

c# - 为什么我的 C# 枚举不起作用?

转换 void 指针并使用格式说明符打印

C++自动构造函数调用