予想外の動きをするコードを書き込むスレ
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2005/05/05(木) 00:40:36へ〜とかあーだこーだいってわいわいやりませんか?
言語と、予想した動き、実際の動き、あとよそから持ってきた場合は出典とか
書いてくれるとわかりやすいと思います
0002デフォルトの名無しさん
2005/05/05(木) 00:41:320003デフォルトの名無しさん
2005/05/05(木) 00:50:530004デフォルトの名無しさん
2005/05/05(木) 01:01:31i = i++;
System.out.println(i);
言語:Java
予想:1
結果:0
出典:ジャヷハウス
当たり前の結果だが、同一変数への代入式でポストインクリメント使うとインクリメントされる予定の処理はもみ消される
正確には裏で元々iだったものをインクリメントしてiに代入してないだけなのかも知れないが機械語追ってないので分からない
0005デフォルトの名無しさん
2005/05/05(木) 01:01:4400065
2005/05/05(木) 01:03:110007デフォルトの名無しさん
2005/05/05(木) 01:03:53志村!!上!!上!!
0008デフォルトの名無しさん
2005/05/05(木) 01:16:35言語:自然言語
予想:『その言葉をずっと待ってたの』
結果:『(゚Д゚)ハァ?』
このコードはオペランドにより出力結果が異なるので注意
0009デフォルトの名無しさん
2005/05/05(木) 01:17:450010デフォルトの名無しさん
2005/05/05(木) 01:59:14オーバーロードとコピーコンストラクタ
には、たまに痛い目にあう。
なので、
コピーコンストラクタをコンパイラに自動生成させないように自前で書く。
コピーコンストラクタが必要ない場合でもassert(false)だけは書いておく。
これで、ミスを早期に発見できる。
実行時ではなく、コンパイル時にコピーコンストラクタを使用禁止にする方法ってある?
0011デフォルトの名無しさん
2005/05/05(木) 02:17:50以下のソースをコンパイルして実行する(java Puzzling)と
どうなるか? (答えはメール欄)
public class Puzzling {
public static void main(String[] args) {
String a = new String("blah");
System.out.println(a);
}
}
public class String {
private java.lang.String a;
public String(java.lang.String a) {
this.a = a;
}
public java.lang.String toString() {
return a;
}
}
0012うーん
2005/05/05(木) 02:22:17public static void main(java.lang.String[] args) {
String a = new String("blah");
System.out.println(a);
}
}
public class String {
private java.lang.String a;
public String(java.lang.String a) {
this.a = a;
}
public java.lang.String toString() {
return a;
}
}
0013デフォルトの名無しさん
2005/05/05(木) 02:46:27マジネタなんだね、
正直唖然
0014デフォルトの名無しさん
2005/05/05(木) 02:51:40メール欄を見ずに解答
答えはコンパイルエラーとなる?
Puzzling#mainの1行目のaの参照型及び生成しようとするオブジェクトの
Stringがjava.lang.Stringなのか、自前のStringなのか分からないから
違うかな
001514
2005/05/05(木) 02:57:26同一パッケージ(この場合はデフォルトパッケージ)内にあるクラスが優先されて
指定なしの場合は全て自前のStringと解釈されるが、そうするとPuzzling#mainの
シグネチャが(java.langString[] args)じゃなくて(自前のString args)となるから実行できなくなるってか...気付かんかったw
0016デフォルトの名無しさん
2005/05/05(木) 05:51:300017さて、間違いは何箇所あるでしょうw
2005/05/05(木) 05:59:43>>57
呼び出し規約
http://www.google.co.jp/search?hl=ja&c2coff=1&q=%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E8%A6%8F%E7%B4%84&lr=lang_ja
呼び出し規約がcdeclなら関数の引数の数は気にしなくていい
f(a,b,c) {
printf("a=%d b=%d c=%d", a,b,c);
}
main()
{
f(1,2,3,4,5,6,7,8,9,10); //○ ただし1,2,3以外は使われない
f(1,2); //× cの値は不定
}
mainもcdeclなので同じ理屈で引数を省略できる
0018デフォルトの名無しさん
2005/05/05(木) 06:22:29スレ荒らすな。お前がこのスレにくんのやめてもらえないかな。
Java叩き厨カコワルイ
0019デフォルトの名無しさん
2005/05/05(木) 06:41:12public static void main(String[] args) throws IOException {
while(1) {
System.out.println("じゃんけんしよう (グー=G, チョキ=C, パー=P)");
new BufferedReader(new InputStreamReader(System.in)).readLine();
System.out.println("貴方の勝ち!");
}
}
}
0020デフォルトの名無しさん
2005/05/05(木) 06:48:50__ __/ / | __ ──
/ ─ / / \ ○ | / | |  ̄ ̄/ ──
__/ _/ / \ | / レ ─┴─ _/
/\___/ヽ
/'''''' '''''':::::::\
. |(〇), 、(〇)、.:|
| ,,ノ(、_, )ヽ、,, .::::|
. | `,rェェェ、 ' .:::::::|
\ |,r-r-| .::::/
,,.....イ.ヽヽ、`ニニ´ーノ゙-、.
: | '; \_____ ノ.| ヽ i
| \/゙(__)\,| i |
> ヽ. ハ | ||
コンパイル通るようにしても必ず勝ちになるのである意味予想外(コード見れば分かるか
0021デフォルトの名無しさん
2005/05/05(木) 12:16:34print("%d\n", 3[a]);
5が出力される
0022デフォルトの名無しさん
2005/05/05(木) 12:17:530023デフォルトの名無しさん
2005/05/05(木) 12:22:54間違箇所数でいうと6, 7箇所
間違い行数でいうと3, 4行
くらいかな?
0024デフォルトの名無しさん
2005/05/05(木) 12:25:21wwwwwwっwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwww
っうぇwうぇおkwwwwwwうぇwww
wwwwwwwうはっwwwっうぇwwwwうはっ
おk
0025デフォルトの名無しさん
2005/05/05(木) 12:36:57すんげえーーーーー
何これどういう仕組みなんだ
0026デフォルトの名無しさん
2005/05/05(木) 13:39:260027デフォルトの名無しさん
2005/05/05(木) 14:12:53&3[a] == 3 + a
以上。
0028デフォルトの名無しさん
2005/05/05(木) 15:15:13num = 0
if num then
puts "Foo"
end
0029デフォルトの名無しさん
2005/05/05(木) 16:49:37$num = 0;
(以下略)
0030デフォルトの名無しさん
2005/05/05(木) 17:43:38鼻から悪魔が出てもかまわないC言語に比べたら
挙動がJLSで規定されてるだけマシだな
0031デフォルトの名無しさん
2005/05/05(木) 18:11:24boost::noncopyable
Boostが嫌ならコピーコンストラクタとoperator =()をprivate内で宣言だけして定義をどこにも書かなければいい。
(noncopyableがやっているのもたったそれだけ)
0032デフォルトの名無しさん
2005/05/05(木) 18:42:00char c0027 = '\u0027';
char c0028 = '\u0028';
2行目でコンパイルエラー
c0027 = '\''; か
c0027 = 0x0027;
ならOK
0033デフォルトの名無しさん
2005/05/05(木) 20:25:51char c27 = '\x27';
wchar_t wc0027 = L'\u0027';
0034デフォルトの名無しさん
2005/05/05(木) 21:30:42スタックの使い方が絶妙だった一個ずらしとか
0035デフォルトの名無しさん
2005/05/05(木) 21:44:010036デフォルトの名無しさん
2005/05/05(木) 22:16:01まさに今、そんなプログラムのデバッグしてる。趣味でだけど。
ブートストラップするコンパイラ等では似た様な事してるね。
0037デフォルトの名無しさん
2005/05/05(木) 23:05:59もっと詳しく
0038デフォルトの名無しさん
2005/05/05(木) 23:50:480039デフォルトの名無しさん
2005/05/06(金) 00:27:060040デフォルトの名無しさん
2005/05/06(金) 00:28:24単にその実行環境のコンパイラが吐いたコードじゃないかと。
0041デフォルトの名無しさん
2005/05/06(金) 09:14:18コンパイラが吐いたコード=実行環境(含むコンパイラ)な状態
0042デフォルトの名無しさん
2005/05/06(金) 10:46:21コンパイラが吐く可能性のあるコード:>>34 スタックの使い方が絶妙だった一個ずらしとか
>>36
> まさに今、そんなプログラム(>>34)のデバッグしてる。趣味でだけど。
> ブートストラップするコンパイラ等では似た様な事(>>34)してるね。
0043デフォルトの名無しさん
2005/05/06(金) 11:06:300044デフォルトの名無しさん
2005/05/06(金) 11:50:54寧ろ、データとして書き換え可能な領域が実行可能な
Intel プロセッサの間抜けぶりに寒心した。
004556
2005/05/07(土) 03:15:04具体的に、どんなコード?
例えば命令中に含まれる定数(ジャンプ先)を書き換えるレベルとか
ANDやORを使って、命令の対象のレジスタを直接変更するレベルとか…
004667
2005/05/07(土) 05:04:06コンパイラが吐く可能性のあるコード:>>34 スタックの使い方が絶妙だった一個ずらしとか
>>36
> まさに今、そんなプログラム(>>34)のデバッグしてる。趣味でだけど。
> ブートストラップするコンパイラ等では似た様な事(>>34)してるね。
0047デフォルトの名無しさん
2005/05/07(土) 22:28:16NT4の時代PAGE_EXECUTEをサポートしてるプロセッサなんて1つもありませんでしたが何か?
Intelプロセッサ「だけ」はセグメントをちゃんと使えばデータ領域を実行禁止にできたけど
0048デフォルトの名無しさん
2005/05/08(日) 22:25:00class Capsule {
private int i = 0;
public void setInt(int i) {
this.i = i;
}
public int getInt() {
return i;
}
public static void main(String[] args) {
Capsule capsule = new Capsule();
capsule.i = 10;
}
}
Capsuleクラスはカプセル化されている。privateな変数iには
通常、同じクラス内からでない限りアクセッサを通じてしかアクセスできない。
と、ここまでは普通だが、同じクラスであれば別インスタンスのprivateメンバに
直接アクセスできるのってちょっとびっくり。
実用で使う事があるのだろうか・・・
0049デフォルトの名無しさん
2005/05/09(月) 02:20:13テスト中に簡単な変更を試したい場合に使うから、
あんま違和感ないな。
同じクラスのインスタンスが、別のインスタンスを参照する
ようなインスタンス・メソッドというのは、
(1) public Capsule plus(Capsule adder) {
setInt(getInt() + adder.getInt());
}
みたいな場合と、
(2) Collection系クラスで設計がまずい場合。
Collectionクラスと要素クラスに分離すべき。
にありそうだな。
他に、使いそうな場面ある?
0050デフォルトの名無しさん
2005/05/09(月) 07:41:10005149
2005/05/09(月) 08:45:38同一クラスの他インスタンスのprivateメンバへのアクセスは、
「意図して行わないとできない」つまり「記述側が自己責任でおこなう」事。
ただしそれは大抵、良くない設計。アクセサ使え
0052デフォルトの名無しさん
2005/05/09(月) 08:49:55まあ、元になったC++のコピーコンストラクタも
それが出来ないとどうしようもないけどな。
俺も最初は違和感があったよ。慣れたけど。
0053デフォルトの名無しさん
2005/05/10(火) 10:50:25http://www.viscuit.com/whatis/
0054デフォルトの名無しさん
2005/05/12(木) 14:59:17そもそも結果を 1 と予想することの方が予想外・・・
4自身も「当たり前の結果だ」と書いているし。
i = ++i; で 0 になるなら意外だけど。
0055デフォルトの名無しさん
2005/05/12(木) 15:57:04ん?行われるはずのインクリメントが行われないのだから予想外だべ?
0056デフォルトの名無しさん
2005/05/12(木) 17:41:10add sp 4
xor eax, eax
mov ecx, sp
mov [ecx], 0
;; i = i ++;
mov eax, [ecx]
inc eax
;; System.out.println(i);
call ...
0057↑とはならずに↓となる
2005/05/12(木) 17:42:31add sp 4
xor eax, eax
mov ecx, sp
mov [ecx], 0
;; i = i ++;
inc eax
;; System.out.println(i);
mov eax, [ecx] ;; ← ローカル変数iを再ロード
call ...
0058デフォルトの名無しさん
2005/05/12(木) 17:42:570059デフォルトの名無しさん
2005/05/12(木) 18:45:12↓
( i = i )++;
↓
i = ( i = i ) + 1;
↓
i = i + 1;
0060デフォルトの名無しさん
2005/05/12(木) 18:53:27Java VMはスタック計算機だから、レジスターなどない。
スタック計算機で、i++したら i++の結果が残りそうなもんだが、
それを残さない仕様にしたのは、何か意味があるんだろ
>>59
いみふめ。
0061デフォルトの名無しさん
2005/05/12(木) 19:33:23public static void main(String args[]) {
int i = 0;
i = i++;
System.out.println(i);
return;
}
}
C:\tmp> javap -classpath . -c Test1
(略)
Method void main(java.lang.String[])
// int i = 0;
0 iconst_0// int定数値0をレジスタにロード
1 istore_1// int iに、レジスタ値(0)を格納
// i = i++;
2 iload_1// int iの値を、レジスタにロード
3 iinc 1 1// スタック上のローカル変数実体 int iに、直接1を加算し代入。直接1を加算
6 istore_1// int iにレジスタ値(元々0)を格納
// System.out.println(i)
7 getstatic #2 <Field java.io.PrintStream out>
10 iload_2
11 invokevirtual #3 <Method void println(int)>
// return;
14 return
0062デフォルトの名無しさん
2005/05/12(木) 19:39:45加算代入 (++や+=)は、JavaVMのiinc命令に翻訳する事になっていて、
iincは、RISCの3オペランド命令一個 (メモリ上の変数に加算代入)に翻訳する事を意図しているんで、
結果として iload → iinc → istore の順番で実行されて、iincの結果は打ち消される、つうことで。
0063デフォルトの名無しさん
2005/05/12(木) 20:19:07インクリメントされる前の i である、
ということを知らない人もいそうな予感・・・
0064デフォルトの名無しさん
2005/05/12(木) 20:36:24int i=0, j=0;
j = i++;
System.out.println(j)
で充分だろ。
0065デフォルトの名無しさん
2005/05/14(土) 12:34:280066デフォルトの名無しさん
2005/05/16(月) 20:57:45副作用が入れ子になっていて、
内側の副作用が打ち消される (>>61の 2〜6バイト目)
と言うべきだろう。
0067デフォルトの名無しさん
2005/05/16(月) 22:11:32>(>>61の 2〜6バイト目)
>(>>61の 2〜6バイト目)
0068デフォルトの名無しさん
2005/05/16(月) 22:23:142〜6バイト目ですが、何か?
>Method void main(java.lang.String[])
> 2 iload_1// int iの値を、レジスタにロード
> 3 iinc 1 1// スタック上のローカル変数実体 int iに、直接1を加算し代入。直接1を加算
> 6 istore_1// int iにレジスタ値(元々0)を格納
0069デフォルトの名無しさん
2005/06/01(水) 00:39:560070デフォルトの名無しさん
2005/06/01(水) 01:31:29何も起こらないのが当然だが…
CでもNULLと等価だったかな、この0。
0071デフォルトの名無しさん
2005/06/01(水) 01:41:430072デフォルトの名無しさん
2005/06/01(水) 14:41:31CではNULLは0または(void *)0だから、等価。
0073デフォルトの名無しさん
2005/06/01(水) 19:49:160074デフォルトの名無しさん
2005/06/04(土) 03:42:17暴走しないと思ってたのにコンパイラがANSI準拠じゃなくて暴走しますたとか。
0075デフォルトの名無しさん
2005/06/04(土) 19:03:310076デフォルトの名無しさん
2005/06/10(金) 23:45:55{
class T {};
void f(T) {}
}
int main()
{
hoge::T n;
f(n); //エラーにならない!
}
引数依存の名前解決と言うそうだ。
0077デフォルトの名無しさん
2005/06/11(土) 00:02:58まあ、
std::cout << "abc" << std::endl;
が
std::operator <<(std::operator <<(std::cout, "abc"), std::endl);
としか書けなかったらみんな泣くだろ?ってことで。
0078デフォルトの名無しさん
2005/06/11(土) 00:36:21delete (hoge*)0;は何もしないのが基本なだけで、
C++でもfreeには0を渡してもいいということにはなってなくね?
0079デフォルトの名無しさん
2005/06/11(土) 00:47:19その場合はoperator <<()はメンバ。
0080SOURCE
2005/06/11(土) 14:33:17ソースファイル名:1.abp
*A
Exec "1.exe"
goto *A
結果:フリーズする
0081デフォルトの名無しさん
2005/07/12(火) 21:00:13int a=100;
int b=0;
int c=a/b;
が0除算エラーにならない。
(ただしコンパイラによると思ふ)
0082デフォルトの名無しさん
2005/07/12(火) 21:28:20抹殺されるってやつか。
0083デフォルトの名無しさん
2005/07/13(水) 14:36:26Java Puzzlers
http://www.amazon.co.jp/o/ASIN/032133678X
0084デフォルトの名無しさん
2005/07/13(水) 22:47:540085デフォルトの名無しさん
2005/07/13(水) 23:41:51なるほど。
確かにエラーにならないよう動作させても構わないわけだ。
0086デフォルトの名無しさん
2005/07/14(木) 00:02:27JAVAで、
String AAA = null;
String BBB = null;
String CCC;
CCC = AAA + BBB;
この結果
CCCには "nullnull"という文字列が入る。
なぜ CCにnullがはいらないのか謎。というか仕様なんだが。
0087デフォルトの名無しさん
2005/07/14(木) 00:28:18理由:ぬるぽ
0088デフォルトの名無しさん
2005/07/14(木) 00:30:45ガッ!
正直ぬるぽで落ちてもらったほうがまだいいのだが。
0089デフォルトの名無しさん
2005/07/14(木) 01:51:26文字列のnullチェックだけ面倒になってムカつく。
009083
2005/07/14(木) 02:26:56トラップが3つあるのだが、3つめに気づかなかった。
Puzzle 23: No Pain, No Gain
import java.util.Random;
public class Rhymes {
private static Random rnd = new Random();
public static void main(String[] args) {
StringBuffer word = null;
switch (rnd.nextInt(2)) {
case 1: word = new StringBuffer('P');
case 2: word = new StringBuffer('G');
default: word = new StringBuffer('M');
}
word.append('a');
word.append('i');
word.appned('n');
System.out.println(word);
}
}
0091デフォルトの名無しさん
2005/07/14(木) 06:02:41>
>CCC = AAA + BBB;
ttp://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/StringBuffer.html
参照。
CCC = newStringBuffer().append(AAA).append(BBB).toString();
をやってるから。
public StringBuffer append(String str)
この文字列バッファに文字列を追加します。
String 引数の文字が、順番にこの文字列バッファの内容に追加されます。
その結果、引数の長さの分だけこの文字列バッファの長さが増えます。
str が null の場合、"null" の 4 文字がこの文字列バッファに追加されます。
0092デフォルトの名無しさん
2005/07/14(木) 09:44:48Java の String は言語仕様レベルで特別扱いされているから
そこはあきらめるしかないでそ。
この場合、StringBuffer#append がぬるぽで落ちないことの方が問題なのかもしれないが。
0093デフォルトの名無しさん
2005/07/14(木) 17:37:36{
int i,j=0;
//printf("Func add2() called\n");
for(i=1;i<=max;i++);
{
j+=i;
//printf("%3d:%4d\n",i,j);
}
return j;
}
0094デフォルトの名無しさん
2005/07/14(木) 20:21:27forループで空文が実行されて、抜ける時点ではi=max+1になってるから、
j=max+1になるわけだが、どの当たりが予想外なの?
0095デフォルトの名無しさん
2005/07/14(木) 20:30:02>forループで空文が実行されて
ここだろ。。やる奴はやる。。
0096デフォルトの名無しさん
2005/07/14(木) 21:53:33{
...
}
じゃなくて
for(i=1;i<=max;i++){
...
}
っていうスタイルで癖をつけておけば、空文forなんて絶対やらないぞ。
0098デフォルトの名無しさん
2005/07/14(木) 22:42:44俺が教えているやつは { と } の対応がなってないコードを書くから逆にそうはさせない。
こっちを使わせる。
for ()
{
}
0099デフォルトの名無しさん
2005/07/14(木) 22:48:130100デフォルトの名無しさん
2005/07/14(木) 23:08:050101デフォルトの名無しさん
2005/07/14(木) 23:17:320102デフォルトの名無しさん
2005/07/15(金) 02:17:42そうだね。
でもミス防止法論議もスレ違いのような希ガス
0103デフォルトの名無しさん
2005/07/15(金) 11:51:24予想7
結果9
0104デフォルトの名無しさん
2005/07/15(金) 12:13:330105デフォルトの名無しさん
2005/07/15(金) 12:16:270106デフォルトの名無しさん
2005/07/15(金) 12:40:03予想:3
結果:12
#スクリプト系言語によくある罠。
0107デフォルトの名無しさん
2005/07/15(金) 17:41:29予想:"foobar"
結果:コンパイルエラー
もちろんC
0108デフォルトの名無しさん
2005/07/15(金) 20:22:32#include <windows.h>
void main(void)
{
BYTE fd_buf [ 1474560 ];
HANDLE hfile;
DWORD readsize;
hfile = CreateFile ( "\\\\.\\A:" ...
ReadFile ( hfile ...
CloseHandle ( hfile );
}
予想:フロッピー丸読み
結果:ワトソン博士登場
0109デフォルトの名無しさん
2005/07/15(金) 22:01:440110デフォルトの名無しさん
2005/07/16(土) 01:34:24> BYTE fd_buf [ 1474560 ];
だよね?
0111デフォルトの名無しさん
2005/07/16(土) 10:33:58はげしくワロタ
0112デフォルトの名無しさん
2005/07/16(土) 23:04:18■ このスレッドは過去ログ倉庫に格納されています