为什么在C ++中`(int)`会优先于赋值?

时间:2018-11-23 00:34:28

标签: c++ syntax variable-assignment

这是我在某些C ++代码中遇到的东西的MWE。

int a = (int)(b/c);

为什么(int)在赋值运算符之后?

不建议这样使用它吗?

4 个答案:

答案 0 :(得分:3)

这只是C样式的类型转换。它用于使作者的意图明确,特别是当b/c的结果是另一种类型(例如unsignedfloat)时。

如果不进行强制转换,通常会向编译器发出有关隐式转换的警告,该转换有时可能会导致后果。通过使用显式强制转换,您表示在程序强制执行的任何其他限制内接受此转换是可以的,并且编译器将执行转换而不会发出警告。

在C ++中,我们使用static_cast<int>(b/c)使演员表更加明确和有意。

答案 1 :(得分:1)

它不是“赋值运算符后的(int)”。

它是“(int)浮点数-b / c的结果”。

它将浮点数转换为整数。

答案 2 :(得分:0)

这是用于将变量或表达式转换为给定类型的转换。在这种情况下,如果bc是浮点数,则添加强制转换(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