No Such Blog or Diary
Java の & のオーバロード
とあるプログラミング初心者の Java プログラムを見ていたら,
if( a <= b & a <= c) { .... }
みたいなコードが書かれていた.
はじめ見たときはC言語であればまったく問題ないコードだけど Java で論理演算の結果を bit 演算しちゃダメだろ,と考えていた.
しかしながら,実はこのコードはコンパイルも通るしちゃんと動く.int と boolean でキャストが自然に起こるようになったのかとも考えたが,実のところ & は boolean 同士をオペランドに取れるようにオーバロードされているだけだった.でもまあ,今までまったく知らなかったので少々驚きだった.
ちなみに,よく考えてみると AND を && でとると左のオペランドが false のときに右側のオペランドは評価されないので,これと対になって両方とも評価される & が存在することは当然だなぁと思う.うーむ,こんなことにも気づかずに何年間 Java 使ってたんだろ... 恥ずかしい
- Comments: 0
- TrackBack (Close): -
HelloWorld
Java で Hello World を書いてみた.ちょっと離れて見ると Hello World になっている.
class Hello {{{ {{{ {{{ {{{ {{ {{ {{{ {{{ {{ {{ {{{ {{{ {{{{{{ {{ {{ {{{{{{{ {{{{{{{{{ {{ {{ {{ {{ }} }} }}} }}} }}}}}}}} }} }} }} }} }}} }}} }} }} }} }} }} }}} }}} }} }} }} }} }} }} }}}}} public static void main (String []a){ {{{{{ {{{ {{{ {{{ {{{ {} }} }}} }}} }} }} }}} }(( (System . out)) ). println ((( "H" +"" +( "" ))+ "" )+ "" +( "e" )+( "l" +( "" )) +( "" )+ "l" +(( "o" +( "" )) +( "" )+ ""+" "+(( "" )+ "" )+ (( "" +"" ))+ "W"+"o" +"rl" +"d" ));}}{}}
動かすとちゃんと Hello World を出力する.C ほどへんなことができないのであまり面白くない... 先の自己出力プログラム生成プログラムに食わせると,Hello World をバナーみたいに出力できてうれしいかも.
- Comments: 0
- TrackBack (Close): -
自己出力プログラムの生成プログラム
Java のソースを読んでそのソースを含む自己出力プログラムを吐くプログラムを書いた.あまり美しくないなぁ...
/*** * 次の Self2.template をソースファイルに埋め込んで, * そのソース全体を含む自己出力プログラムを作成する. * 実行クラス名は SelfPrint (Self2.template のクラス名) となる. * \r は置き換えないのでソース中に含まないようにすること. * \n, \t, " を %n, %t, %c という文字に変換して文字列を埋め込むので, * ソースはこれらを含まないこと. * あと, %s もあるとまずい. * エスケープ文字もまずそう. * Self.template の main 関数で何かメソッドを呼ぶように書けば仕事もできる. * そのばあい,画面出力があると自己出力の意味が無いけど... *---------------------- Self2.template start -------------------------- class SelfPrint { static String s="%s"; public static void main(String [] args) { String ss=s.replaceAll(new String(new byte []{37, 110}), new String(new byte []{10})); ss=ss.replaceAll(new String(new byte []{37, 116}), new String(new byte []{9})); ss=ss.replaceAll(new String(new byte []{37, 99}), new String(new byte []{34})); ss=ss.replaceAll(new String(new byte []{37, 115}), s); System.out.print(ss); } } *---------------------- Self2.template end -------------------------- * */ import java.io.*; class SelfGen2 { public static void main(String [] args) throws Exception { if(args.length <= 0){ System.out.println("Usage: java SelfGen2 input.java"); System.out.println("Note: input.java should not contain CR"); System.exit(0); } File file = new File(args[0]); FileReader fis = new FileReader(file); int len = (int)file.length(); char [] buf = new char[len]; len = fis.read(buf, 0, len); String source = new String(buf, 0, len); File tfile = new File("Self2.template"); FileReader tfis = new FileReader(tfile); int tlen = (int)tfile.length(); char [] tbuf = new char[tlen]; tlen = tfis.read(tbuf, 0, tlen); String template = new String(tbuf, 0, tlen); source = source + template; //System.out.println(source); String ss = source; ss=ss.replaceAll(new String(new byte []{10}), new String(new byte []{37, 110})); ss=ss.replaceAll(new String(new byte []{9}), new String(new byte []{37, 116})); ss=ss.replaceAll(new String(new byte []{34}), new String(new byte []{37, 99})); source=source.replaceAll(new String(new byte []{37, 115}), ss); System.out.print(source); } }
- Comments: 0
- TrackBack (Close): -