В интервью я столкнулся с таким вопросом:
Ваш друг дал вам единственный файл исходного кода, который печатает числа Фибоначчи на консоли. Обратите внимание, что блок main () пуст и внутри него нет операторов.
Объясните, как это возможно (подсказка: глобальный экземпляр!)
Я действительно хочу знать об этом, как такое вообще возможно!
assert
или#pragma message
и т. Д. Это перенаправит вывод на консоль во время компиляции. Программа может никогда не скомпилироваться полностью, но это наверняка интересный способ продемонстрировать свое "нестандартное" мышление во время собеседования. Это удовлетворяет процитированный вопрос, так как ничего не упоминается о создании двоичного файла; скорее, это просто говорит о файле C, который может отображать "материал" на консоли. ;-)Ответы:
Скорее всего, это реализовано как (или его вариант):
void print_fibs() { //implementation } int ignore = (print_fibs(), 0); int main() {}
В этом коде глобальная переменная
ignore
должна быть инициализирована перед входом вmain()
функцию. Теперь, чтобы инициализировать глобал,print_fibs()
необходимо выполнить все, что угодно - в данном случае вычислить числа Фибоначчи и распечатать их! Похожую вещь я показал в следующем вопросе (который я задавал давно):Обратите внимание, что такой код небезопасен, и его лучше всего избегать. Например,
std::cout
объект может не инициализироваться приprint_fibs()
выполнении, если да, то что будетstd::cout
делать в функции? Однако, если в других обстоятельствах это не зависит от такого порядка инициализации, можно безопасно вызывать функции инициализации (что является обычной практикой в C и C ++).источник
std::ios_base::Init
объекта. И<iostream>
гарантированно ведет себя так, как если бы он содержал экземплярstd::ios_base_Init
объекта в области пространства имен.(print_fibs(), 0)
равенint
. Вот онлайн-демо .bool
и переменнойbool fibsPrinted
. Вероятно, это будет немного чище, если функция будет работать только здесь. (Но разницы, вероятно, недостаточно, чтобы о ней беспокоиться.)std::cout
находится где-то в библиотеке. Но, как я уже отмечал, стандарт требует, чтобы он был инициализирован до завершения работы первого конструктораstd::ios_base::Init
объекта, и требует, чтобы включение<iostream>
велось так, как если быstd::ios_base::Init
объект был определен в области пространства имен. Если единица трансляции включает<iostream>
до определения инициализируемого объекта, тоstd::cout
создание гарантированно будет.Надеюсь это поможет
class cls { public: cls() { // Your code for fibonacci series } } objCls; int main() { }
Итак, как только глобальная переменная класса объявляется, вызывается конструктор, и вы добавляете туда логику для распечатки ряда Фибоначчи.
источник
Да, это возможно. Вам необходимо объявить глобальный экземпляр объекта, который вычисляет числа Фибоначчи в конструкторе объекта.
источник
Я знаю несколько примеров, подобных тем, что вы рассказываете. Один из способов получить это - использовать метапрограммирование шаблона. С его помощью вы можете перенести некоторый вычислительный процесс в компиляцию.
Здесь вы можете получить пример с числами Фибоначчи.
Если вы используете его в конструкторе статического класса и можете писать числа без необходимости писать какой-либо код в основной функции.
Надеюсь, это поможет тебе.
источник
Что-то может случиться во время инициализации глобальных / статических переменных. Код сработает при запуске приложения.
источник
Все [*] конструкторы для объектов файловой области вызываются перед достижением
main
, как и все выражения инициализатора для переменных файловой области, не являющихся объектами.Изменить: Кроме того, все [*] деструкторы для всех объектов файловой области вызываются в обратном порядке построения после
main
выхода. Теоретически вы можете поместить свою программу Фибоначчи в деструктор объекта.[*] Обратите внимание, что 'all' игнорирует поведение динамической загрузки и выгрузки библиотек, с которыми ваша программа не была напрямую связана. Однако технически они выходят за рамки базового языка C ++.
источник
main
?main
он пуст, поэтому эти DLL / DSO должны быть загружены деструкторами, что чертовски неверно. Но поскольку это информатика, я полагаю, нам следует быть осторожными со словами типа «все».