Это называется Quine.
Итак, давайте посмотрим, что main()
делает:
printf(s,34,s,34);
34 является ASCII код символа "
(двойные кавычки), так это то же самое, как:
printf(s, '"', s, '"');
Первый аргумент в printf(3)
- это строка формата. Строка, передаваемая является:
"char *s = %c%s%c; main(){printf(s,34,s,34);}"
Так, printf(3)
будет выводить точно, но обратите внимание на спецификатор %c
, %s
и %c
формата, которые инструктируют printf(3)
напечатать символ, за которым следует строка, а затем еще один символ в том, что место, которые являются соответственно 2-м, 3-м и 4-м аргументами.
Символы, как мы видели, являются как "
, так и строка s
(эта же строка). Таким образом, выход программы:
char *s = "X"; main(){printf(s,34,s,34);}
Где X
это строка s
в программе. Таким образом, мы получаем это как выход:
char *s = "char *s = %c%s%c; main(){printf(s,34,s,34);}"; main(){printf(s,34,s,34);}
Какой, интересно, сам источник программы.
Знаете ли вы, что делает 'printf'? Вы можете определить, что 'printf (" char * s =% c% s% c; main() {printf (s, 34, s, 34);} ", 34," char * s =% c% s% c; main() {printf (s, 34, s, 34);} ", 34)' печатает, учитывая, что 34 является кодом ASCII для '' '? – immibis
Теперь это официально - мне ужасно не хватает навыков анализа – Malina
Я знаю, что такое 34 и что делает printf .. это просто семантически меня смущает. – Malina