转换隐含时为什么要转换?

The*_*ain 4 c casting

我在c中看到了一些像这样的代码

int main()
{
    int x = 4, y = 6;
    long z = (long) x + y;

}
Run Code Online (Sandbox Code Playgroud)

即使在这种情况下它是隐含的,铸造的好处是什么?哪个操作先x + y或先x?

Ste*_*mit 7

在这种情况下,演员阵容可以达到目的.如果你写的

int x = 4, y = 6;
long z = x + y;
Run Code Online (Sandbox Code Playgroud)

将对int值执行添加,然后,将总和转换为long.因此添加可能会溢出.在这种情况下,转换一个操作数会导致使用long值执行加法,从而减少溢出的可能性.

(显然,在的情况下,46它不会反正溢出.)

回答你的第二个问题,当你写作

long z = (long)x + y;
Run Code Online (Sandbox Code Playgroud)

演员肯定是先申请,这很重要.另一方面,如果你写的话

long z = (long)(x + y);
Run Code Online (Sandbox Code Playgroud)

在添加之后将应用强制转换(并且为时已晚,因为已经在整数上执行了添加).

同样,如果你写

float f = x / y;
Run Code Online (Sandbox Code Playgroud)

甚至

float f = (float)(x / y);
Run Code Online (Sandbox Code Playgroud)

除法将在int值上执行,并将丢弃余数,f最终将包含0.但如果你写的话

float f = (float)x / y;
Run Code Online (Sandbox Code Playgroud)

除法将使用浮点执行,f并将收到0.666666.