vak: (Default)
[personal profile] vak
Сложить два целых числа, вернуть целое. Породить исключение в случае арифметического переполнения.
int add(int a, int b);
Удивительно, сколько народу обламывается на этой задачке.

Date: 2020-08-03 08:43 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Кто все эти безумные люди, которые рассуждают про unsigned, какие-то там детали реализации каких-то там конкретных версий языков программирования, про битовые операции, 2's complement представление? Какая нахер разница? Машина может быть хоть троичная симметричная, и не иметь понятия об "unsigned".

Пятикласснику должно быть понятно, что достаточно знать только MAX и MIN для данного типа операндов, и делается это так: нарочно не на языке программирования, а на естественном языке.

1. Если хотя бы одно из чисел равно нулю или числа с разным знаком, то складываем без опаски.
2. Если оба числа положительные, то вычтем из MAX одно из них. Если разность меньше другого числа, то бросаем исключение.
3. Если оба числа отрицательные, то вычтем из MIN одно из них. Если разность больше другого числа, то бросаем исключение.
4. Складываем числа, возвращаем результат.

По-хорошему, спрашивать надо про
template< typename T > int add(const T & a, const T & b); и вопрос тогда будет про type traits (который синтаксис я так и не запомнил).

Date: 2020-08-03 23:30 (UTC)
From: [personal profile] caztd
Ну если уж на то пошло, то машина может и не иметь концепта арифметического переполнения или MAX/MIN для определенного типа операндов. Поэтому совсем от машины абстрагироваться не получится.

А уж если мы говорим про язык Си, то мы обычно говорим об этом не для красоты, а для того чтоб писать эффективный и быстрый код. Потому что если вам не нужен такой код, то зачем вам Си? Берите Питон или JS какой-нибудь в самом деле. Ну а если вам нужен эффективный и быстрый код, то вам никогда-никогда не следует использовать вышеуказанный алгоритм для пятиклассников. Потому что он медленный, плохо-читается,
в нем легко сделать ошибку, которую потом будет трудно найти.

Но спасибо за такой вариант. Я еще раз убедился, что даже в мире программистов на Си есть миры, которые не просто слегка отличаются, а не соприкасаются друг с другом вообще. Какая уж там политика может быть, когда люди не просто разные бывают, а многие прямо-таки абсолютно чужды друг другу.

Date: 2020-08-04 05:03 (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Если арифметическое переполнение упомянуто в условии, то, следовательно, MAX/MIN существует.
Условия интервьюшной задачки нужно принимать как данность.

Смешивать два ремесла индустриального программирования и прохождения интервью есть тьма искусников. Я не из их числа.