在C中简单表达的奇怪输出,为什么?

Lig*_*ger 4 c c++ turbo-c++

我正在使用TurboC++.我写下面的表达式并没有得到正确的评价,我错过了它背后的一些概念吗?

int c=300*300/300;
printf("%d",c);
Run Code Online (Sandbox Code Playgroud)

输出是

81

为什么?

Jos*_*ron 27

300*300 is 90000.
Run Code Online (Sandbox Code Playgroud)

假设int是16位,那么你已经溢出了.

溢出环绕,给你:24464.

24465/300 = 81.55
Run Code Online (Sandbox Code Playgroud)

不要依赖于此.这是未定义的行为.


Bat*_*eba 9

300*300/300的评估从左到右进行.

300*300溢出16位有符号整数类型(intTurbo C++中为16位).由于计算将在带符号的算术中进行,因此结果是未定义的.

发生的事情是300*300正在回合给你24464.(24464 + 32768 + 32768 = 90000).

24464/300是整数除法的81.

  • 表达式的类型基于其操作数的类型 - 而不是它们的值.无论int的值如何,`int`乘以`int`给出`int`. (3认同)