1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Задачка для программистов на СС+ :)

Тема в разделе "Развлечения", создана пользователем alexmyt, 4 окт 2008.

  1. alexmyt

    alexmyt Старожил Команда форума

    Итак, вопрос знатокам: Сколько раз на экране появится заветная фраза при выполнении этой программы?

    Код:
    int main(int argc, char* argv[])
    {
       int i = 10;
       std::cout<<"Hello World!"<<std::endl;
       
       // Сколько раз???
       while(i--)
       {
          // Сколько раз будет вызвана эта строка???/
          for(int j=0; j<10; j++)
             std::cout<<"Hello World!"<<std::endl;
       }
       return 0;
    }
    Можете задать этот вопрос своим учителям информатики. Если решите тупо забить код в компилятор и посчитать строки - напишите каким именно компилятором пользовались. Ответ обязательно обоснуйте.

    ЗЫ: сам я не программирую на С.
     
  2. Мартын

    Мартын Завсегдатай

    Я тоже не программирую на С и не в курсе как выводить текст на экран, но если вот это: std::cout<<"Hello World!"<<std::endl; - вывод строки на экран, то тогда она будет показана 111 раз. Я так думаю.
    З.Ы. Забыл обосновать. Из моих скудных познаний в С могу сказать что цикл for прокручивается 10 раз, цикл While крутится пока условие есть true, а насколько я помню из древности в С любое неотрицательное число есть true. Значит While будет крутиться от 10 до 0, а это 11 раз, то есть 11*10=110, ну и 1 раз вывод строки перед циклом.
    Знания языка не хватает, так что решение основано на озрызках воспоминаний 10 летней давности...
     
  3. alexmyt

    alexmyt Старожил Команда форума

    Если у кого-то есть своя собственная версия - велкам :)
    Мартыну: имхо, в С 0 == false, все-таки. Но подвох здесь не в этом :)
     
  4. Мартын

    Мартын Завсегдатай

    Етить-колотить! Точно, 0==false . Ну и если выражение сначала будет вычисляться, а результат проверяться на true, то while прокрутится не 11, а 9 раз.
    А какой тут подвох?
     
  5. alexmyt

    alexmyt Старожил Команда форума

    Опят же, на сколько я помню, i-- - выражение сначала проверяется, потом декрементируется, --i - сначала декрементируется, потом вычисляется. Хотя я могу и ошибаться.

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

    А я еще думал - не кинуть ли задачку на вычисление арифметической последовательности... :(
     
  6. alexmyt

    alexmyt Старожил Команда форума

    Ок, никому больше, видимо, не интересно. В общем "правильный" компилятор поздоровается с миром 11 раз. Неправильный - 101, но сделает предупреждение о том что он кое-что проигнорировал. Уже говорить - что именно?
     
  7. alexmyt

    alexmyt Старожил Команда форума

    Обратите внимание на комментарии. Дело в том, что символ ??/ — это, так называемый, триграф.

    Ниже перечислены основные триграфы:

    Триграф (Эквивалентный символ)
    ??= #
    ??/ \
    ??' ^
    ??( [
    ??) ]
    ??! |
    ??< {
    ??> }
    ??- ~

    Триграфы использовались во времена языка Си когда не на всех клавиатурах были заменяемые символы. Что интересно — данная особенность по-прежнему позволяет «пудрить мозги» даже в Visual Studio 2008, хотя необходимость в использовании триграфов давно отпала. Хотя стоит отдать должное компилятор от Microsoft выдает соответствующее предупреждение. GCC, в данном случае, оказался более «современным» и триграфы просто игнорирует.

    Таким образом следующая за триграфом ??/ строка будет добавлена к комментарию (действие "\" обратного слеша)

    Ответ

    Ответ будет разным в зависимости от компилятора и его настроек: 101 либо 11, если триграфы учитываются.

    Задачка взята с Хабрахабра.
     

Загрузка...