Приоритет * и / в С

Я не понял логику ответа. Я попытался напечатать значение после определения, и оно показывает =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) поэтому деление происходит первым.

Другие вопросы по тегам