2012-09-03 128 views
0

有人请给我下面代码的解释。输出如代码后所述。c代码输出混乱

char s[] = "char s[] = %c%s%c; main(){ printf(s,43,s,43); }"; 

void main(){ 
    printf(s,34,s,34); 
} 

输出 -

 
char s[] = "char s[] = %c%s%c; main(){ printf(s,43,s,43); }"; main(){ printf(s,43,s,43); } 
+0

这是一个简单的自我复制程序。有那么多解释吗? –

+0

它们被称为* quines *。 :-) – oldrinb

+1

在范围内使用没有原型的'printf()'是未定义的行为... :) – pmg

回答

2

您正在使用的字符串作为char s[] = %c%s%c; main(){ printf(s,43,s,43); }格式化字符串。

第一个参数的格式为%c。参数是34。因此它会打印出值为34的ASCII字符,即"(一个字符;双引号)。

第二个参数的格式为%s。参数是相同的格式字符串,char s[] = %c%s%c; main(){ printf(s,43,s,43); }。所以它打印出相同的字符串。

第三个参数是%c,也是34,因此它会打印另一个引号。

就是这样。在部分:

lit --> char s[] = 
%c --> " 
%s --> char s[] = %c%s%c; main(){ printf(s,43,s,43); } 
%c --> " 
lit --> ; main(){ printf(s,43,s,43); } 

,当放在一起,就是:

char s[] = "char s[] = %c%s%c; main(){ printf(s,43,s,43); }"; main(){ printf(s,43,s,43); } 
+0

请注意,由于使用'43'而不是'34'打印出版本,因此quine似乎被破坏。 – oldrinb

+3

这更多的是在一个奎宁失败的尝试。但海报并没有问任何有关奎因的问题 – Claudiu

+1

输出中也缺少'main'的返回类型。 – aschepler