Posted on 2008-03-24 20:34
李战 阅读(13359)
评论(8) 编辑 收藏 所属分类:
软件思想
今天是情人节,无聊中就把以前写的这个程序发一下:
class writeme{static void Main(){string s="class writeme{{static void Main(){{string s={0}{1}{0};System.Console.Write(s,(char)34,s);}}}}"; System.Console.Write(s,(char)34,s);}}
有趣的是,这个C#程序编译运行后,又会在控制台中输出和自身一模一样的源代码。注意,输出自己的源代码确实是靠自身代码的运行而产生的。
从逻辑学上说,自我包含往往会产生逻辑悖论,但这个程序却不会。
你知道为什么吗?
李战(leadzen).深圳 2008-2-14
Feedback
System.Console.Write(s,(char)34,s)
把上面的"(char)34" 改成一个其它字符如:"@" 再将s改为其它字符如"cnblogs"再输出程序可以明白,
只是不知道为为什么字符"{{"输出的时候为什么变成了"{"
@snryang
因为string.Format的第一个参数里'{'必须使用"{{"表示,以免与"{0}"这样的表达方式混淆.
class C
{
static void Main()
{
string s = @"class C
{{
static void Main()
{{
string s = @{0}{1}{0};
System.Console.Write(s,(char)34,s);
}}
}}";
System.Console.Write(s,(char)34,s);
}
}
是不是因为@符号?有了@就直接将类当字符串变量输出了