Вот тут случайно наткнулся на задачку от Страуструпа.
Напишите корректную программу на С++, содержашую последовательность по крайней мере из десяти идущих подряд различных ключевых слов, не разделенных индификаторами, операторами, символами пунтктуации и т. д.
Я подумал, но больше чем 8 выставить не смог:
class A
{
friend static inline const unsigned int operator or(const A&,const A&);
...
};
Как, скажите, можно записать 10(или даже более)?
Я так пологаю, что макрозамена ключевых слов считается не честной, иначе их можно очень много выставить.
Здравствуйте Fantasist, Вы писали:
F>Вот тут случайно наткнулся на задачку от Страуструпа.
F> F>
F> Напишите корректную программу на С++, содержашую последовательность по крайней мере из десяти идущих подряд различных ключевых слов, не разделенных индификаторами, операторами, символами пунтктуации и т. д.
F>Я подумал, но больше чем 8 выставить не смог:
F>
F>class A
F>{
F> friend static inline const unsigned int operator or(const A&,const A&);
F> ...
F>};
F>
F>Как, скажите, можно записать 10(или даже более)?
F>Я так пологаю, что макрозамена ключевых слов считается не честной, иначе их можно очень много выставить.
do do do do do do do do do while (true) break; while (true); while (true); while (true); while (true); while (true); while (true); while (true); while (true); while (true);
Здравствуйте Klestov, Вы писали:
K>Здравствуйте Kaa, Вы писали:
Kaa>>Здравствуйте Fantasist, Вы писали:
F>>>Как, скажите, можно записать 10(или даже более)?
Kaa>>Ну, второе, что пришло в голову:
Kaa>>
Kaa>>while ( sizeof unsigned char )
Kaa>> while( sizeof signed short )
Kaa>> while( sizeof unsigned long )
Kaa>> return;
Kaa>>
F>> Напишите корректную программу на С++, содержашую последовательность по крайней мере из десяти идущих подряд различных ключевых слов, не разделенных индификаторами, операторами, символами пунтктуации и т. д.
K>
K>do do do do do do do do do while (true) break; while (true); while (true); while (true); while (true); while (true); while (true); while (true); while (true); while (true);
K>
Не, об этом я первым делом подумал, но: "...десяти идущих подряд различных ключевых"
Здравствуйте Fantasist, Вы писали:
F>Здравствуйте Klestov, Вы писали:
F> F>>> F>>>
F>>> Напишите корректную программу на С++, содержашую последовательность по крайней мере из десяти идущих подряд различных ключевых слов, не разделенных индификаторами, операторами, символами пунтктуации и т. д.
K>>
K>>do do do do do do do do do while (true) break; while (true); while (true); while (true); while (true); while (true); while (true); while (true); while (true); while (true);
K>>
F>Не, об этом я первым делом подумал, но: "...десяти идущих подряд различных ключевых"
Здравствуйте Klestov, Вы писали:
K>Здравствуйте Fantasist, Вы писали:
F>>Здравствуйте Klestov, Вы писали:
F>> F>>>> F>>>>
F>>>> Напишите корректную программу на С++, содержашую последовательность по крайней мере из десяти идущих подряд различных ключевых слов, не разделенных индификаторами, операторами, символами пунтктуации и т. д.
K>>>
K>>>do do do do do do do do do while (true) break; while (true); while (true); while (true); while (true); while (true); while (true); while (true); while (true); while (true);
K>>>
F>>Не, об этом я первым делом подумал, но: "...десяти идущих подряд различных ключевых"
K>10 совершенно различных ? Ну тогда ... подумаем
Комментарий
/*
for do class this struct break switch case friend inline
*/
Здравствуйте Fantasist, Вы писали:
F>Вот тут случайно наткнулся на задачку от Страуструпа.
F> F>
F> Напишите корректную программу на С++, содержашую последовательность по крайней мере из десяти идущих подряд различных ключевых слов, не разделенных индификаторами, операторами, символами пунтктуации и т. д.
F>Я подумал, но больше чем 8 выставить не смог:
F>
F>class A
F>{
F> friend static inline const unsigned int operator or(const A&,const A&);
F> ...
F>};
F>
F>Как, скажите, можно записать 10(или даже более)?
F>Я так пологаю, что макрозамена ключевых слов считается не честной, иначе их можно очень много выставить.
#define for
#define do
#define class
#define this
#define struct
#define break
#define switch
#define case
#define friend
#define inline
for do class this struct break switch case friend inline
K>#define for
K>#define do
K>#define class
K>#define this
K>#define struct
K>#define break
K>#define switch
K>#define case
K>#define friend
K>#define inline
K>for do class this struct break switch case friend inline
K>
K>>#define for
K>>#define do
K>>#define class
K>>#define this
K>>#define struct
K>>#define break
K>>#define switch
K>>#define case
K>>#define friend
K>>#define inline
K>>for do class this struct break switch case friend inline
K>>
K>Не честно но работает )))))))))))))))))
Ну, что так работает это понятно. Но так не интересно, так и гораздо больше уместить можно.
Здравствуйте Fantasist, Вы писали:
F>Вот тут случайно наткнулся на задачку от Страуструпа.
F> F>
F> Напишите корректную программу на С++, содержашую последовательность по крайней мере из десяти идущих подряд различных ключевых слов, не разделенных индификаторами, операторами, символами пунтктуации и т. д.
F>Я подумал, но больше чем 8 выставить не смог:
F>
F>class A
F>{
F> friend static inline const unsigned int operator or(const A&,const A&);
F> ...
F>};
F>
F>Как, скажите, можно записать 10(или даже более)?
Можно добавить еще 'volatile' и, например, 'short'. А вот 'or' иногда за полноценное ключевое слово не считают...
friend static inline const volatile unsigned short int operator or(const int&, const int&);
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Можно добавить еще 'volatile' и, например, 'short'. А вот 'or' иногда за полноценное ключевое слово не считают...
АТ>
АТ>friend static inline const volatile unsigned short int operator or(const int&, const int&);
АТ>
Но: 'friend static' — нельзя. И, кстати, параметры на 'const int&' я зря заменил. Так тоже нельзя.
F> Напишите корректную программу на С++, содержашую последовательность по крайней мере из десяти идущих подряд различных ключевых слов, не разделенных индификаторами, операторами, символами пунтктуации и т. д.
class A {
extern virtual inline operator const signed short int () { return 0L; }
};
Здравствуйте Fantasist, Вы писали:
F>Вот тут случайно наткнулся на задачку от Страуструпа.
F> F>
F> Напишите корректную программу на С++, содержашую последовательность по крайней мере из десяти идущих подряд различных ключевых слов, не разделенных индификаторами, операторами, символами пунтктуации и т. д.
F>Я подумал, но больше чем 8 выставить не смог:
10!
struct S
{
friend inline const volatile unsigned long int bitand operator and(S, S)
{
static unsigned long int a = 1;
return a;
}
};
Здравствуйте Klestov, Вы писали:
K>Здравствуйте Fantasist, Вы писали:
F>>Вот тут случайно наткнулся на задачку от Страуструпа.
F>> F>>
F>> Напишите корректную программу на С++, содержашую последовательность по крайней мере из десяти идущих подряд различных ключевых слов, не разделенных индификаторами, операторами, символами пунтктуации и т. д.
F>>Я подумал, но больше чем 8 выставить не смог:
F>>
F>>class A
F>>{
F>> friend static inline const unsigned int operator or(const A&,const A&);
F>> ...
F>>};
F>>
F>>Как, скажите, можно записать 10(или даже более)?
F>>Я так пологаю, что макрозамена ключевых слов считается не честной, иначе их можно очень много выставить.
K> K>
K>class A {
K>extern virtual inline operator const signed short int () { return 0L; }
K>};
K>
K>8 но ....
Нельзя применять 'extern' к декларации члена класса. Но опять же можно добавить 'volatile':
class A {
virtual inline operator const volatile signed short int () { return 0L; }
};
Здравствуйте dupamid, Вы писали:
D>Здравствуйте Fantasist, Вы писали:
F>>Вот тут случайно наткнулся на задачку от Страуструпа.
F>> F>>
F>> Напишите корректную программу на С++, содержашую последовательность по крайней мере из десяти идущих подряд различных ключевых слов, не разделенных индификаторами, операторами, символами пунтктуации и т. д.
F>>Я подумал, но больше чем 8 выставить не смог:
D>10!
D>
D>struct S
D>{
D> friend inline const volatile unsigned long int bitand operator and(S, S)
D> {
D> static unsigned long int a = 1;
D> return a;
D> }
D>};
D>
F>> Напишите корректную программу на С++, содержашую последовательность по крайней мере из десяти идущих подряд различных ключевых слов, не разделенных индификаторами, операторами, символами пунтктуации и т. д.
F>>Я подумал, но больше чем 8 выставить не смог:
D>10!
D>
D>struct S
D>{
D> friend inline const volatile unsigned long int bitand operator and(S, S)
D> {
D> static unsigned long int a = 1;
D> return a;
D> }
D>};
D>
Остроумно, но тем не менее согласно тому, что я вынес для себя из одной из дискуссий в comp.lang.c++, alternative tokens не являются ключевыми словами.
Здравствуйте Klestov, Вы писали:
АТ>>Нельзя применять 'extern' к декларации члена класса. Но опять же можно добавить 'volatile':
АТ>>class A { АТ>>virtual inline operator const volatile signed short int () { return 0L; } АТ>>};
K>Можно добавить и 'extern' — рабочий код.
Что значит "рабочий код"? С++ запрещает применение 'extern' в декларациях членов класса, о чем однозначно сказано в 7.1.1/5
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Остроумно, но тем не менее согласно тому, что я вынес для себя из одной из дискуссий в comp.lang.c++, alternative tokens не являются ключевыми словами.
Это конечно, но они к ним очень близки хотя формально являются операторами. Тяжело найти компилятор который бы не считал их идентификаторами на ряду с new и delete, и запрещал бы
#define and xa-xa!
На том основании что and не идентификатор, а preprocessing-op-or-punc.
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Здравствуйте Klestov, Вы писали:
АТ>>>Нельзя применять 'extern' к декларации члена класса. Но опять же можно добавить 'volatile':
АТ>>>class A { АТ>>>virtual inline operator const volatile signed short int () { return 0L; } АТ>>>};
K>>Можно добавить и 'extern' — рабочий код.
АТ>Что значит "рабочий код"? С++ запрещает применение 'extern' в декларациях членов класса, о чем однозначно сказано в 7.1.1/5
struct A
{
virtual inline __cdecl operator volatile const signed short int () { return 0; }
};
[]
АТ>Нельзя применять 'extern' к декларации члена класса. Но опять же можно добавить 'volatile':
АТ>class A { АТ>virtual inline operator const volatile signed short int () { return 0L; } АТ>};
А в чем смысл добавления volatile? Не касаясь данной задачи.
АТ>>friend static inline const volatile unsigned short int operator or(const int&, const int&);
АТ>>
АТ>Но: 'friend static' — нельзя. И, кстати, параметры на 'const int&' я зря заменил. Так тоже нельзя.
А почему static нельзя? У меня тоже было такое ощущение, что он там лишний, но VC его скомпилировал, и я тогда тоже подумал, а почему собственно нельзя? Чем друг функция отличается от не друга? Может быть логически static и лишний в объявлении друга, но синтаксически кому он мешает?
Как же я не догадался short поставить (да и никто до этого тоже)!! А volatile я бы и не догадался поставить, потому как слабо представляю, зачем такой модификатор возращаемому значению?
АТ>> А вот 'or' иногда за полноценное ключевое слово не считают...
Забавно, у БС "Язык С++ специальное издание" эти слова перечисленны среди ключевых, без всяких комментариев.
Здравствуйте UgN, Вы писали:
UgN><skipped>
UgN>else do extern inline const volatile signed short int operator + (int p,TClassB p2);
UgN><skipped> UgN>[/ccode]
UgN>10.
Здравствуйте Fantasist, Вы писали:
F>Вот тут случайно наткнулся на задачку от Страуструпа.
F>
F> Напишите корректную программу на С++, содержашую последовательность по крайней мере из десяти идущих подряд различных ключевых слов, не разделенных индификаторами, операторами, символами пунтктуации и т. д.
Хм.
Есть такой известный постинг:
В заявлении, потрясшем весь компьютерный мир, Кен Томпсон, Деннис
Ричи и Брайан Керниган признали, что операционная система UNIX и язык
программирования Си, созданные ими -- тщательно спланированный
первоапрельский розыгрыш, "продержавшийся" более 20 лет. Выступая на
последнем Конгрессе разработчиков программного обеспечения для ОС ДЕМОС
(UnixWorld Software Development Forum), Томпсон признал следующее:
...
Мы остановились, добившись
успешной компиляции следующего:
Мы не могли даже представить, что современные программисты будут
пытаться использовать язык, допускающий подобный оператор!
...
Ничего не напоминает?
C++ — это прикол от Страуструпа, который даже и представить не мог, что современные программисты будут
пытаться использовать язык, допускающий употребление 10 различных ключевых слов подряд...
Здравствуйте UgN, Вы писали:
UgN> D>>inline писать писать нельзя.
UgN>Почему? Компиляется VS6 на ура...
По-тому что inline нельзя указывать при объявлении в локальной области, в которой не может быть описание этой функции. А что до VS6 то это не пример поробуй здесь http://www.comeaucomputing.com/tryitout/.
Здравствуйте Xentrax, Вы писали:
X>И финальный вариант
Хм. А че так напрягаться. Взял бы да просто скопировал всю таблицу ключевых слов в окошко, да написал рядом "Вив ля Франс! 63 подряд! Кто больше?!"
Здравствуйте Андрей Тарасевич, Вы писали:
АТ>Остроумно, но тем не менее согласно тому, что я вынес для себя из одной из дискуссий в comp.lang.c++, alternative tokens не являются ключевыми словами.
насколько я понял из Стандарта, они не являются ключевыми словами по крайней мере по двум причинам:
1) они не перечислены в таблице ключевых слов С++
2) они являются тем же самым, что обозначают, т.е. скобками, операторами и т.п, которые, в свою очередь, не являются ключевыми словами.
Здравствуйте Kaa, Вы писали:
Kaa>Хм. А че так напрягаться. Взял бы да просто скопировал всю таблицу ключевых слов в окошко, да написал рядом "Вив ля Франс! 63 подряд! Кто больше?!"
Не соберется
Кстати, я не совсем понимаю, что значит typedef в этом коде...
UgN>C++ — это прикол от Страуструпа, который даже и представить не мог, что современные программисты будут пытаться использовать язык, допускающий употребление 10 различных ключевых слов подряд...
Но 10 ключевых слов пока не удалось никому написать
Хе-хе, а кто-то говорил, что нужно инстанцировать?
В модной книжке Modern C++ Design, которую я сейчас читаю, на этом трюке построено несколько интересных вещей.
Ну а уж если инстанцировать, то тогда больше 10-и не получилось
class AAA{
template < int > int g()
{
if (true);
else do typedef operator typename volatile const signed short int ();
while (1);
}
int ggg()
{g<1>();
}
};
X>class AAA{
X> template < int > int g()
X> {
X> if (true);
X> else do typedef operator typename volatile const signed short int ();
X> while (1); <...>
Если не создавать объектов то да — можно писать туфт, но ведь она НЕРАБОТАЕТ и спрашивается какие можно интересные штуки делать на том что в принципе работать не будет
Разве что плодить и размножать ошибки
Здравствуйте Klestov, Вы писали:
K>Если не создавать объектов то да — можно писать туфт, но ведь она НЕРАБОТАЕТ и спрашивается какие можно интересные штуки делать на том что в принципе работать не будет
Туфту (как в моем варианте без инстанцирования) конечно не нужно писать. В принципе, как уже было сказано, то, что обсуждается в данной теме в реальном коде быть не должно.
Но от инстанцирования только при необходимости есть иногда и польза.
Функция SwitchPrototype не будет компилироваться до тех пор, пока ее не вызовет пользователь. То есть если в используемом нами варианте CreationPolicy нет функций GetPrototype и SetPrototype, то компилятор ни слова не скажет, хотя SwitchPrototype их и вызывает.
Здравствуйте Xentrax, Вы писали:
X>Функция SwitchPrototype не будет компилироваться до тех пор, пока ее не вызовет пользователь. То есть если в используемом нами варианте CreationPolicy нет функций GetPrototype и SetPrototype, то компилятор ни слова не скажет, хотя SwitchPrototype их и вызывает.
Внесу небольшую ясность. Код внутри шаблонов должен быть синтаксически корректным в любом случае, в случае если он настраивается, то еще и семантически корректным. По Стандарту разрешено не выдавать ошибки о синтаксических проблемах в шаблонах до момента настройки, но от этого программа содержащая синтксические ошибки в не настраиваемых шаблонах коррктной не становится.
MS Visual C++, которым здесь большинство пользуется не почти не проверяет синтаксис не настроенных шаблонов функций, поэтому ошибки и не выдаются до момента настройки.
Здравствуйте Xentrax, Вы писали:
X>Функция SwitchPrototype не будет компилироваться до тех пор, пока ее не вызовет пользователь. То есть если в используемом нами варианте CreationPolicy нет функций GetPrototype и SetPrototype, то компилятор ни слова не скажет, хотя SwitchPrototype их и вызывает.
Это не показательно. Однажды, в каком-то файле, будут объявлены (даже не обязательно реализованы) эти функции GetPrototype/SetPrototype, а также будет использована SwitchPrototype.
Фишка в том, что шаблоны позволяют много вольностей с сигнатурами функций — лишь бы число явных (!) параметров было тем же самым. И это правильно.
А поскольку "слабое объявление функции" языком и здравым смыслом не предусмотрено, то отложенная проверка разрешена.
Аналог этого — неявное объявление функций в голом Си.
//////////////////////
// main.c
// никаких #include <stdio.h>int main()
{
printf("hello\n"); // Компилятор полагает, что '_printf' - это функция
// с прототипом extern "C" int cdecl func(...);
printf(); // Сожрет, слинкует и бабахнет при исполнении.
printf(12345); // поэтому лучше все-таки объявить ( включить <stdio.h> )
}
// конец файла main.c
//////////////////////
Перекуём баги на фичи!
Re[7]: Не оверквоть!
От:
Аноним
Дата:
14.11.02 08:41
Оценка:
Здравствуйте Klestov, Вы писали:
K>Здравствуйте Klestov, Вы писали:
K>>Здравствуйте UgN, Вы писали:
UgN>>>Здравствуйте dupamid, Вы писали:
UgN>>> D>>>>inline писать писать нельзя.
UgN>>>Почему? Компиляется VS6 на ура...
UgN>>>It's compiled? First screen shows? Let's sell it!
UgN>>>А что до смысла -- так я скорее застрелюсь чем в своей программе ТАКОЕ напишу.
UgN>>>
K>>Я тоже.
K>Но inline по хорошему писать нельзя. То что его понимает VC так это его проблемы — он стандарта не придерживается в отличии от C++Builder
Это завист от версии. VC7.1 лучше соответвует стандарту, чем C++Builder6 и вряд ли это изменится в будущем.