Відповідь Спаркі - це один стандартний спосіб вирішити цю проблему, але, як я також писав у своєму коментарі, ви ризикуєте переповнювати. Це можна вирішити за допомогою ширшого типу, але що робити, якщо ви хочете розділити long long
s?
Відповідь Натана Ернста пропонує одне рішення, але воно включає виклик функції, оголошення змінної та умовне, що робить її не коротшою за код ОП та, ймовірно, навіть повільніше, оскільки її важче оптимізувати.
Моє рішення таке:
q = (x % y) ? x / y + 1 : x / y;
Це буде трохи швидше, ніж код OPs, тому що модуль і поділ виконуються за допомогою тієї ж інструкції на процесорі, тому що компілятор може бачити, що вони еквівалентні. Принаймні gcc 4.4.1 виконує цю оптимізацію за допомогою прапора -O2 на x86.
Теоретично компілятор може вбудовувати виклик функції в код Натана Ернста і випромінювати те саме, але gcc цього не робив, коли я тестував його. Це може бути тому, що він прив'язує складений код до однієї версії стандартної бібліотеки.
На завершення, це не має значення для сучасної машини, за винятком випадків, коли ви знаходитесь в надзвичайно тісному циклі і всі ваші дані знаходяться в регістрах або L1-кеші. Інакше всі ці рішення будуть однаково швидкими, за винятком, можливо, Натана Ернста, який може бути значно повільнішим, якщо функція повинна бути отримана з основної пам'яті.
q = x/y + (x % y != 0);