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

Weird output of simple expression in C, why?

我正在使用 TurboC++。我写了以下表达式,它没有得到正确的评估,我是否遗漏了它背后的一些概念?

int c=300*300/300;
printf("%d",c);

输出是

81

为什么?

300 * 300 / 300 的计算从左到右发生。

300 * 300 溢出 16 位有符号整数类型(Turbo C++ 中的 int 是 16 位)。由于计算将在有符号算术中进行,结果未定义

发生的事情是 300 * 300 循环得到 24464。(24464 + 32768 + 32768 = 90000)。

24464 / 300整数除法是81

300*300 is 90000.

假设int是16bit,你已经溢出了。

溢出环绕,给你:24464

24465/300 = 81.55

不要依赖这个。这是未定义的行为。