UgN>C++ — это прикол от Страуструпа, который даже и представить не мог, что современные программисты будут пытаться использовать язык, допускающий употребление 10 различных ключевых слов подряд...
Но 10 ключевых слов пока не удалось никому написать
Вот тут случайно наткнулся на задачку от Страуструпа.
Напишите корректную программу на С++, содержашую последовательность по крайней мере из десяти идущих подряд различных ключевых слов, не разделенных индификаторами, операторами, символами пунтктуации и т. д.
Я подумал, но больше чем 8 выставить не смог:
class A
{
friend static inline const unsigned int operator or(const A&,const A&);
...
};
Как, скажите, можно записать 10(или даже более)?
Я так пологаю, что макрозамена ключевых слов считается не честной, иначе их можно очень много выставить.
Здравствуйте Xentrax, Вы писали:
X>Функция SwitchPrototype не будет компилироваться до тех пор, пока ее не вызовет пользователь. То есть если в используемом нами варианте CreationPolicy нет функций GetPrototype и SetPrototype, то компилятор ни слова не скажет, хотя SwitchPrototype их и вызывает.
Внесу небольшую ясность. Код внутри шаблонов должен быть синтаксически корректным в любом случае, в случае если он настраивается, то еще и семантически корректным. По Стандарту разрешено не выдавать ошибки о синтаксических проблемах в шаблонах до момента настройки, но от этого программа содержащая синтксические ошибки в не настраиваемых шаблонах коррктной не становится.
MS Visual C++, которым здесь большинство пользуется не почти не проверяет синтаксис не настроенных шаблонов функций, поэтому ошибки и не выдаются до момента настройки.
Здравствуйте 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>Я так пологаю, что макрозамена ключевых слов считается не честной, иначе их можно очень много выставить.
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>Не, об этом я первым делом подумал, но: "...десяти идущих подряд различных ключевых"
Здравствуйте 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 в этом коде...
Хе-хе, а кто-то говорил, что нужно инстанцировать?
В модной книжке 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 их и вызывает.
Это не показательно. Однажды, в каком-то файле, будут объявлены (даже не обязательно реализованы) эти функции 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 и вряд ли это изменится в будущем.