Эта программа является классическим примером программы, которая печатает свой исходный код на stdout
.Символ 34 Ascii является литералом ascii для "
, который необходим для того, чтобы иметь возможность печатать разделители строки C, не сталкиваясь с бесконечной рекурсивной задачей.Есть некоторые символы, которые нельзя использовать буквально, так как они преобразуются компилятором, одним из них является "
, который исчезает при компиляции в строковом литерале, другие - экранированные литералы char \n
, \t
,... в зависимости от этого, конвертировать в другой символ литерал.Это причина того, что исходный код должен быть все в одной строке (управляющие символы преобразуются самим компилятором), нельзя разрешать операторы #include ...
(потому что он заканчивается символом новой строки) и другие подобные вещи.
Скомпилируйте и реорганизуйте его (для ясности вы изменили его при публикации), чтобы вы могли выводить тот же исходный код, что и компилятору.
Примечание
Код программы, чтобы точно имитировать исходную форму в выводе, должно быть записано как:
char*p="char*p=%c%s%c;main(){printf(p,34,p,34);}";main(){printf(p,34,p,34);}
без завершающего символа новой строки в конце строки.
Если вы замените 34
на '\"'
, а p по значению, вы получите:
...
printf(
"char*p=%c%s%c;main(){printf(p,34,p,34);}",
'\"',
"char *p=%c%s%c;main(){printf(p,34,p,34);}",
'\"');
, который сформирует исходную строку, поместив правильные разделители в правильные позиции.(примечание: %c
и %s
в третьем параметре больше не раскрываются)
Примечание2
Эта программа зависит от кодировки ASCII для "
.Это не должно работать на кодировках EBCDIC (вы должны использовать кодировку для "
вместо числа 34)