Odpowiedź Sparky jest jednym ze standardowych sposobów rozwiązania tego problemu, ale jak napisałem również w moim komentarzu, istnieje ryzyko przepełnienia. Można to rozwiązać za pomocą szerszego typu, ale co jeśli chcesz podzielić long long
s?
Odpowiedź Nathana Ernsta zapewnia jedno rozwiązanie, ale wymaga wywołania funkcji, deklaracji zmiennej i warunku, co czyni go nie mniejszym niż kod OP i prawdopodobnie nawet wolniejszym, ponieważ trudniej go zoptymalizować.
Moje rozwiązanie jest następujące:
q = (x % y) ? x / y + 1 : x / y;
Będzie to nieco szybsze niż kod OPs, ponieważ modulo i podział są wykonywane przy użyciu tej samej instrukcji procesora, ponieważ kompilator widzi, że są one równoważne. Przynajmniej gcc 4.4.1 wykonuje tę optymalizację z flagą -O2 na x86.
Teoretycznie kompilator może wstawiać wywołanie funkcji w kodzie Nathana Ernsta i emitować to samo, ale gcc tego nie zrobił, kiedy go testowałem. Może tak być, ponieważ wiązałoby skompilowany kod z jedną wersją standardowej biblioteki.
Na koniec, żadna z tych kwestii nie ma znaczenia na nowoczesnym komputerze, z wyjątkiem sytuacji, gdy jesteś w bardzo ciasnej pętli, a wszystkie twoje dane znajdują się w rejestrach lub pamięci podręcznej L1. W przeciwnym razie wszystkie te rozwiązania będą równie szybkie, z wyjątkiem ewentualnie Nathana Ernsta, które mogą być znacznie wolniejsze, jeśli funkcja musi zostać pobrana z pamięci głównej.
q = x/y + (x % y != 0);
wystarczy