149ea694a792f3ad2caaf77077a0df58 Спорящая с богом
Искала вопросы для технического интервью (начальство дало "добро" на третьего программиста в проект), нашла одну красивую задачку:
В следующем коде изменить ОДИН знак так, чтобы напечаталось 20 звездочек:
int n = 20;
for ( int i = 0; i < n; i-- ) printf( "*" );
Есть 3 решения, 2 из них релевантны для любого Си-образного языка (предположим, что в области видимости кода существует функция printf оборачивающая в себя вызов функции вывода на консоль) и одно, которое не будет компилироваться например на Java или C# (это такая жирная подсказка, ага). Кто сможет найти все 3?
В следующем коде изменить ОДИН знак так, чтобы напечаталось 20 звездочек:
int n = 20;
for ( int i = 0; i < n; i-- ) printf( "*" );
Есть 3 решения, 2 из них релевантны для любого Си-образного языка (предположим, что в области видимости кода существует функция printf оборачивающая в себя вызов функции вывода на консоль) и одно, которое не будет компилироваться например на Java или C# (это такая жирная подсказка, ага). Кто сможет найти все 3?
мои мысли, мои скакуны
Вам студенты не нужны?
Хм.. и третий тоже тогда. Надо внимательнее думать
ошибки нет. Первый вариант - правильно, остальные 2 не будут работать совсем. Думай дальше.
Не, студент нам не годится;о((( надо опыт и в С++, и в C#, ну и всякое ещё вокруг: SQL, WinForms, NET Remoting, сервисы, сетевые протоколы. Мы как раз скорее кого-нибудь предпенсионного возраста ищем.
"Вам действительно так нужен программист?" -- спросил я. "Нам позарез нужен программист". -- "Я поговорю с ребятами, -- пообещал я. -- Я знаю недовольных". -- "Нам нужен не всякий программист, -- сказал горбоносый. -- Программисты -- народ дефицитный, избаловались, а нам нужен небалованный". -- "Да, это сложнее", -- сказал я. Горбоносый стал загибать пальцы: "Нам нужен программист: а -- небалованный, бэ -- доброволец, цэ -- чтобы согласился жить в общежитии..." -- "Дэ, -- подхватил бородатый, -- на сто двадцать рублей". -- "А как насчет крылышек? -- спросил я. -- Или, скажем, сияния вокруг головы? Один на тысячу!" -- "А нам всего-то один и нужен", -- сказал горбоносый. "А если их всего девятьсот?" -- "Согласны на девять десятых". (с)
Возможно, через какое-то время будет ставка QA. Тебя иметь в виду?
читать дальше
Возможно, не всегда (от компайлера, вроде, зависит), но должен работать.
-- унарный оператор, он второй операнд не примет, да и что это даст?
Я, кажется, придумал и третий вариант, но не до конца. Сижу биты считаю ))
Браво!
там вопрос даже не в неявном приведении типов, а в том, что в С/С++ не было отдельного типа для буллевой переменной, все буллевы выражения сводились к int: 0 и -1 (0xFFFFFFFF в 32-битных системах, то есть ~0).
Sly Leren,
не факт, что я их буду задавать. Просто искала кто что спрашивает на собеседованиях и задачка понравилась, чисто для себя. Хотя, ИМХО, n-- вполне на поверхности и любой нормальный программер догадается.
ЕМНИП, чуть иначе. Во времена оны целочисленный 0 считался ложью, а любое ненулевое значение - истиной. C++ такое поведение досталось по наследству, что может приводить к плохочитаемому коду:
char* str1 = "Hello, World!";
char buff[32];
char& str2 = buff;
while (*str2 ++ = *str1 ++);
А то и вовсе к ошибкам.
да, всё правильно, любое ненулевое - истина, с неявным приведением типов. Но буллево выражение типа у==х можно было присвоить в int и результат в большинстве компиляторов был равен -1. Кстати, не везде, Visual C++, если не ошибаюсь, присваивал 1.