Отправляет email-рассылки с помощью сервиса Sendsay

Web-Мастеринг - с нуля до профи

  Все выпуски  

нет.


Познавательное программирование

(comp.soft.prog.urisprog)

Выпуск 32


Комментарии к "Курьёзам C++"


Здравствуйте, Уважаемые подписчики!

ПОДПИСАТЬСЯ...

Я открыл новую рассылку - называется «ИСТИНА» (код - lit.quotation.true, описание).
Тематика - высказывания (и статьи) из моей книги.
Программирования никак не касается! Но Я ГАРАНТИРУЮ, что будет интересно...

Вы можете [подписаться по почте]
(просто отправьте пустое письмо со своего ящика, а затем подтвердите подписку).


Продолжим...

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

Комментарии к статье


  1. arr[1]=123;
    1[arr]=123;
    Невероятно, но обе этих строки идентичны по смыслу!
    (Об этом я уже как-то говорил в рассылке.)

    Michael Jastrebtsoff:
    Ничего невероятного, это правила operator[] для C++, поскольку он преобразовывается в: *(arr+1) = 123;


  2. double a=1.0,b=1.0,c=1.0;
    double *pa=&a;
    b=c/*pa;
    Приведённый код синтаксически абсолютно верен, однако не компилируется.
    Чтобы откомпилировалось - нужно заменить последнюю строку на b=c/(*pa); или поместить пробел между "b=c/" и "*pa;".

    Michael Jastrebtsoff:
    Парсер С++ (как С незнаю) является "жадным" и производит разбор до самой длинной лексемы, поэтому воспринимает "/*" как начало комментария, по этим же причинам необходимо ставить пробел в объявлении: std::vector<std::vector<int> > , иначе будет "сдвиг вправо"


  3. for(i=0;i<10;)
    {
    +i;
    }
    Здесь синтаксически всё правильно и программа даже компилируется, но не работает. :)

    Michael Jastrebtsoff:
    1. В цикл не войдет ни разу (i==0)
    2. +i это тоже самое что operator+(i), т.е. применение операции "унарный плюс"
    3. В цикле for по стандарту любое из выражений может отсутствовать (или все)


  4. struct A
    {
    int A;
    } A;
    Парадокс: Объявление структуры A типа A...

    Michael Jastrebtsoff:
    Этот код скомпилируется только C-компилятор(не С++), просто грамматика такая у него, все "A" - это разные имена.


Комментарии от Владимира (Vovan):
По поводу С и С++ : есть много всяких "приколов". Например то, что без проблем компилируются и выполняются выражения типа

2+3;

или

19;

Многие компиляторы правда выдают предупреждение что код бессмысленный. Но синтаксис правилен.
Намного более интересны фишки с "++". Пусть у нас есть объявленная переменная int i; тогда:
++i++ - ошибка
(++i)++ - работает
++++i и даже +++++i (и любое количество "+") - работает
i++++ - ошибка

Почему и как компилятор обрабатывает такие конструкции (а также конструкции в стиле i+++j, i++++j, i++j, i+(+j) ) предлагаю подумать самостоятельно ;-) .

Комментарии от Arni (Arnold Urbanovich):
Врядли следующие примеры можно отнести к курьезам C++:
2. b=c/*pa;
Здесь компилятор расценивает /* как начало комментария

3. for(i=0;i<10;){+i;}
Программа работает, но не так как задумывалось!
Просто условие выхода не достигается, получается вечный цикл (i не увеличивается)




Все вопросы, пожелания и предложения ведущему рассылки, прошу слать на e-mail: urisff@inbox.ru
Все статьи публикуются здесь только с разрешения (или рекомендации) автора.
Если вы хотите опубликовать здесь свою статью, то сделайте это, переслав её мне (желательно в виде html, причём без картинок). В случае, если вы будете использовать приведённые в этой рассылке материалы, не забудьте сделать ссылку на эту рассылку.

Ведущий рассылки:
Набатников Иван, urisff@inbox.ru
http://www.tireal.com


В избранное