是否可以编写一个Java printf语句来打印语句本身?
是否可以有一个Java是否可以编写一个Java printf语句来打印语句本身?,java,printf,quine,Java,Printf,Quine,是否可以有一个Javaprintf语句,它的输出就是语句本身 下面是一些示例片段: // attempt #1 public class Main { public static void main(String[] args) { System.out.printf("something"); } } 这将打印某些内容 因此,尝试#1的输出并不完全是尝试#1中的printf语句。我们可以试试这样的方法: // attempt #2 public class Main { public s
printf
语句,它的输出就是语句本身
下面是一些示例片段:
// attempt #1
public class Main {
public static void main(String[] args) {
System.out.printf("something");
}
}
这将打印某些内容
因此,尝试#1的输出并不完全是尝试#1中的printf
语句。我们可以试试这样的方法:
// attempt #2
public class Main {
public static void main(String[] args) {
System.out.printf("System.out.printf(\"something\");");
}
}
现在输出是System.out.printf(“某物”)代码>
现在,trument#2的输出与输出#1中的语句匹配,但我们回到了以前的问题,因为我们需要trument#2的输出与trument#2中的语句匹配
那么,是否可以编写一行打印自己的printf
语句呢
public class Main {
public static void main(String[] args) {
System.out.printf("System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);",34,"System.out.printf(%c%s%1$c,34,%1$c%2$s%1$c);");
}
}
输出()是:
此输出与printf
语句匹配
可能会有更短的解决方案
另见
-
%[argument\u index$]转换
System.out是一个静态PrintStream实例,可由inovking System.out.setOut(PrintStream s)用任何PrintStream替换。
因此,只需编写PrintStream的子类并重写必要的方法。
下面只是一个非常简单的示例。最好覆盖更多的方法
public class VerbosePrintStream extends PrintStream{
public VerbosePrintStream (PrintStream ps){
super(ps, true);
}
@Override
public void println(String x) {
super.println("System.out.println(\""+x + "\");");
}
}
现在我们测试上述类:
VerbosePrintStream vps = new VerbosePrintStream(System.out);
System.setOut(vps);
System.out.println("test string");
这是一个更一般的概念的变体。@ire_和_curses:yes,这就是为什么我给它加上这样的标签。主要区别在于要求使用一行程序printf
,因此不能在显式局部变量中存储任何内容。抱歉,我没有注意到您的标记。有趣的是,我们的想法是使用上面的基本代码框架,没有任何声明,局部变量或类型,没有其他语句,只要编写满足上述条件的printf
语句即可。
VerbosePrintStream vps = new VerbosePrintStream(System.out);
System.setOut(vps);
System.out.println("test string");