Простая и интересная задачка по C++

Всем привет, я сам ещё новичок в C++(< 2 лет изучаю), но уже что-то понимаю и решил сделать задачу на основы языка для совсем зелёных, для решения из C++ вам нужно будет знать функции, cout и указатели.


Итак, задача:

Дан следующий код: http://pastebin.com/5ehUmhZB


Результат его выполнения:

Hello, World
secret function 42

Вопросы:

1 Почему выводится secret function 42, если вызывается только printHelloWorld(); 

2 Откуда взялось число 42?


Подсказки:

1 Не потому что 42 - это ответ на «главный вопрос Жизни, Вселенной и Всего Остального»

2 На других архитектурах и компиляторах результат может быть другим, я компилил в linux gcc 5.4.0 x64


P.S. Если не верите, можете убедиться сами https://www.tutorialspoint.com/viewproject.php?URL=compile_cpp_online.php&PID=0Bw_CjBb95KQMTW9WaTliUXRqc1U

Лига программистов C/C++

63 поста4.8K подписчиков

Добавить пост

Правила сообщества

Соблюдайте правила Pikabu:

https://pikabu.ru/html.php?id=wtf


Помимо этого ЗАПРЕЩЕНО:

- Размещать в сообществе посты стиля "Подскажите как удалить вирус", "Подскажите как установить программу", "Подскажите как починить монитор/телевизор/мышь/тостер/стиральную машину" или "Напишите за меня лабу в универ". Пожалуйста размещайте такие посты вне этого сообщества или в соответствующих для этого сообществах.

Вы смотрите срез комментариев. Показать все
Автор поста оценил этот комментарий

я конечно совсем ноль в программировании, но разве нельзя было использовать строку "using namespace std" вместо

using std::cout;

using std::cin;

using std::endl;

раскрыть ветку (6)
Автор поста оценил этот комментарий

Можно было, но тогда подключится другой "мусор" и компиляция будет чуть медленнее, ну и  просто хороший стиль программирования.

раскрыть ветку (5)
5
Автор поста оценил этот комментарий

Нет. "Подключается мусор" директивой include, using лишь определяет используемые пространства имён. Теоретически, замедление в ноль целых хрен тысячных будет, но по факту единственная причина указывать поклассовое using - борьба с пересечением имён. До тех пор, пока вы не делаете платформозависимые  реализации каких-либо действий, и не конфигурируете их с помощью манипуляции пространствами имён, делать этого не стоит.

раскрыть ветку (4)
Автор поста оценил этот комментарий

Я не говорю, про подключение объектных или заголовочных файлов, я говорю, что компилятору чуть больше работы, размер исполняемого файла будет зависеть, от того, какие библиотеки включит сборщик и компилятор, но да, вы правы на счёт того, что замедление не значительно. А под хороший стиль программирования я в частности и имел ввиду, что не будет пересечений имён.

раскрыть ветку (3)
1
Автор поста оценил этот комментарий

Вы не поняли, #include <iostream> включает ВЕСЬ iostream. using std::cout лишь добавляет ::cout как синоним ::std::cout в список существующих классов, не более (или, наоборот, при поиске ::cout так же ищет ::std::cout). То есть разницу можно заметить, если вы делаете using namespace %NAMESPACE% для ста пространств имён и двухсот подключаемых заголовочников. В обратном случае, вы замедляете разбор файла разбором дополнительных строк.


Ну и используйте uintptr_t для хранения указателей. Для чего он ещё нужен-то?

раскрыть ветку (2)
Автор поста оценил этот комментарий

Да я в курсе что он включает) На счёт скорости компиляции, может быть я не прав. Сейчас проверил скриптом на баше, который много раз компилит одно и то же, на таком примере особой разницы нет.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Потому что размер операции теряется в статистической погрешности. Вообще, вся компиляция теряется в погрешности скорости запуска. Нужно генерировать синтетику минимум на 5МБ исходников.

Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку