这是我在某些C ++代码中遇到的东西的MWE。
int a = (int)(b/c);
为什么(int)
在赋值运算符之后?
不建议这样使用它吗?
答案 0 :(得分:3)
这只是C样式的类型转换。它用于使作者的意图明确,特别是当b/c
的结果是另一种类型(例如unsigned
或float
)时。
如果不进行强制转换,通常会向编译器发出有关隐式转换的警告,该转换有时可能会导致后果。通过使用显式强制转换,您表示在程序强制执行的任何其他限制内接受此转换是可以的,并且编译器将执行转换而不会发出警告。
在C ++中,我们使用static_cast<int>(b/c)
使演员表更加明确和有意。
答案 1 :(得分:1)
它不是“赋值运算符后的(int)”。
它是“(int)浮点数-b / c的结果”。
它将浮点数转换为整数。
答案 2 :(得分:0)
这是用于将变量或表达式转换为给定类型的转换。在这种情况下,如果b
和c
是浮点数,则添加强制转换(int)
会将结果强制为整数。
具体来说,这是“ C样式转换”,现代C ++还提供了一些附加的转换,以提供更多控制权(static_cast,dynamic_cast,const_cast等)
答案 3 :(得分:0)
这是一个错误。在代码中:
int a = b/c;
然后,如果除法的结果是超出int
范围的浮点值(例如,截断后超过INT_MAX
),则可能导致undefined behaviour。如果您使用警告标志,编译器可能会对此发出警告。
将代码更改为int a = (int)(b/c);
不会影响代码的行为,但是可能会导致编译器抑制该警告(编译器有时将强制类型转换视为程序员表达自己的意愿的意图。看到警告)。
因此,除非您以前的代码的设计方式不能使除法结果永远不会超出范围,否则现在您只有静默的未定义行为。
一个更好的解决方案是:
long a = std::lrint(b/c);
如果商超出范围,则它将在a
中存储未指定的值,您可以使用浮点错误处理来检测错误。 Reference for std::lrint