* 和 / 在 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)
,这样除法先发生。
我不明白答案背后的逻辑。我尝试打印 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)
,这样除法先发生。