* 和 / 在 C 中的优先级

Precedence of * and / in C

我不明白答案背后的逻辑。我尝试打印 a 定义后的值,它显示 a=72。请帮忙。

    #include<stdio.h>
    main()
    {
       int a=400*400/400;
       if(a==400)
       printf("Do good");
       else
       printf("Have good");
    }

输出:好的

我想在您的平台上 int 是 2 字节宽,16 位。

然后

400*400 = 28928

由于溢出

28928/400 = 72

400*400 = 160 000 = 18 bits. 如果将其转换为 16 位,则会得到 28928.

28928 / 400 = 72,32

由于其他答案没有解决问题的标题: */是相同的优先级,具有left-to-right结合性。这意味着 400*400 发生在除法之前。

A google 在 C 中搜索 Operator Precedence 结果 http://en.cppreference.com/w/c/language/operator_precedence 作为第一个命中。您甚至尝试过使用谷歌搜索您的问题标题吗?


其他答案已经很好地解释了 72 是因为 int 在您的平台上是 16 位的。您可以使用 400UL * 400 / 400 来计算 unsigned long 的结果,或者 ULL 计算 unsigned long long,因为 unsigned long 至少需要 32 位。

这里避免整数溢出的另一种方法是将其写成400 * (400/400),这样除法先发生。