Приоритет * и / в С
Я не понял логику ответа. Я попытался напечатать значение после определения, и оно показывает =72. Пожалуйста помоги.
#include<stdio.h>
main()
{
int a=400*400/400;
if(a==400)
printf("Do good");
else
printf("Have good");
}
выход: есть хорошо
3 ответа
Я думаю, что на вашей платформе int
имеет ширину 2 байта, 16 бит.
затем
400*400 = 28928
Из-за переполнения
28928/400 = 72
400*400 = 160 000 = 18 bits.
Если вы конвертируете это в 16 бит, вы получите 28928
,
28928 / 400 = 72,32
Поскольку другие ответы не касались названия вопроса:*
а также /
одинаковый ранг приоритета, с ассоциативностью слева направо. Это означает, что 400*400 происходит до деления.
Поисковый запрос Google для "Приоритет оператора в C" включает 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)
поэтому деление происходит первым.