Я открыл новую рассылку - называется «ИСТИНА» (код - lit.quotation.true, описание).
Тематика - высказывания (и статьи) из моей книги.
Программирования никак не касается! Но Я ГАРАНТИРУЮ, что будет интересно...
Вы можете [подписаться по почте]
(просто отправьте пустое письмо со своего ящика, а затем подтвердите подписку).
Продолжим...
По предыдущему выпуску были некоторые комментарии от читателей. Так как эти комментарии проясняют ситуацию с "курьёзами", я решил сделать ещё один выпуск.
Комментарии к статье
arr[1]=123;
1[arr]=123;
Невероятно, но обе этих строки идентичны по смыслу!
(Об этом я уже как-то говорил в рассылке.)
Michael Jastrebtsoff:
Ничего невероятного, это правила operator[] для C++, поскольку он
преобразовывается в: *(arr+1) = 123;
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> > , иначе будет "сдвиг вправо"
for(i=0;i<10;)
{
+i;
}
Здесь синтаксически всё правильно и программа даже компилируется, но не работает. :)
Michael Jastrebtsoff:
1. В цикл не войдет ни разу (i==0)
2. +i это тоже самое что operator+(i), т.е. применение операции "унарный плюс"
3. В цикле for по стандарту любое из выражений может отсутствовать (или все)
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, причём без картинок).
В случае, если вы будете использовать приведённые в этой рассылке материалы, не забудьте сделать ссылку на эту рассылку.