Обсуждение:Куайн (программирование): различия между версиями
Tswr (обсуждение | вклад) Нет описания правки |
Tswr (обсуждение | вклад) |
||
Строка 3: | Строка 3: | ||
http://cougar.eb.com/dictionary/quine |
http://cougar.eb.com/dictionary/quine |
||
== ... |
== ... == |
||
"main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);} |
"main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);} |
||
Следует заметить, что это программа несовместима со стандартом C99, а также с C++, поскольку эти стандарты требуют явного указания типа возвращаемого значения для функций (в данном случае — int main). Кроме того, даже при следовании устаревшему стандарту C89 использование функции printf без включения заголовочного файла (#include <stdio.h>), вообще говоря, приводит к неопределённому поведению." |
Следует заметить, что это программа несовместима со стандартом C99, а также с C++, поскольку эти стандарты требуют явного указания типа возвращаемого значения для функций (в данном случае — int main). Кроме того, даже при следовании устаревшему стандарту C89 использование функции printf без включения заголовочного файла (#include <stdio.h>), вообще говоря, приводит к неопределённому поведению." |
Версия от 08:00, 14 ноября 2009
Куин / Квин а не Куайн / Квайн
http://cougar.eb.com/dictionary/quine
...
"main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);} Следует заметить, что это программа несовместима со стандартом C99, а также с C++, поскольку эти стандарты требуют явного указания типа возвращаемого значения для функций (в данном случае — int main). Кроме того, даже при следовании устаревшему стандарту C89 использование функции printf без включения заголовочного файла (#include <stdio.h>), вообще говоря, приводит к неопределённому поведению."
Два замечания:
1) Вызов printf без включения <stdio.h> в общем случае не приводит к неопределенному поведению. Это так до тех пор, пока типы аргументов printf после продвижения типов аргументов (default argument promotion) совместимы (а на самом деле даже взаимозаменяемы, interchangeable) с типами соответствующих аргументов в определении этой функции. В данном примере это соблюдается.
2) Порядок вычисления аргументов в операции вызова функции не специфицирован. Это значит, в данном примере первым аргументом вызова printf может быть значение параметра "a" как до, так и после присваивания строкового литерала. То есть этот пример вызывает неопределенное поведение с точки зрения всех трех стандартов.
Вероятно, стоит подыскать другой пример. Может быть не такой эффектный, но все-таки корректный.
Ivan A. Kosarev 09:08, 25 августа 2008 (UTC)
Про Brainfuck убило...77.121.156.179 08:04, 15 октября 2008 (UTC)
BrainFuck
"19:06, 21 октября 2008 217.9.88.18 (обсуждение) (9349 байт) (удалил - →Brainfuck)"
--
и зачем???
89.109.25.150 15:53, 31 января 2009 (UTC)
Курьез
Возможно такое и на языке ассемблера. Только вот, по злой иронии судьбы ассемблерная реализация куина была расценена как вирус и попала в антивирусные базы под именем Virtool.DOS.Apiary. Ссылки: http://www.nf-team.org/drmad/zf/zf5/zf5_029.htm и http://www.securelist.com/ru/viruses/encyclopedia?virusid=55320 . Почему бы не добавить к статье, не забыв упомянуть пикантные обстоятельства? :)