C和*的优先级

时间:2015-11-19 11:06:12

标签: c operator-precedence

我没有得到答案背后的逻辑。我试图打印一个后定义的值,它显示a = 72。请帮忙。

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

输出:有好的

3 个答案:

答案 0 :(得分:10)

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

然后

400*400 = 28928

由于溢出

28928/400 = 72

答案 1 :(得分:4)

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

28928 / 400 = 72,32

答案 2 :(得分:0)

由于其他答案未涉及问题的标题: */具有相同的优先级,具有从左到右的关联性。这意味着400 * 400在分裂之前发生。

谷歌搜索C中的运算符优先级会导致http://en.cppreference.com/w/c/language/operator_precedence成为第一个匹配。您是否尝试使用Google搜索问题的标题?

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

另一种避免整数溢出的方法是将其写为400 * (400/400),以便首先进行除法。