週に一回は書きますよ 月に4つ記事を書けばノルマは満たされます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

なんか妙なバグがあると思ったらintのつもりの変数をboolにしていました。

bool t = true;
bool f = false;
for (int i = -1; i < 2; ++i) {
  cout << t + i << ' ' << f + i << endl;
}
出力>>
0 -1
1 0
2 1
これはboolからintへの暗黙の変換でしょうか。でも次のとか
bool b = false;
for (int i = 0; i < 300; ++i) {
  cout << b;
  ++b;
}
cout << endl;
出力>> 011111111111111111(snip)
これとか
bool b = false;
for (int i = 0; i < 300; ++i) {
  cout << b;
  b -= 1;
}
cout << endl;
出力>> 010101010101(snip)
どういう意味があるのかわかりません。ちなみに最後のコードは b--がコンパイルエラーになったので b -= 1;になっています。どっちも却下してほしい。
スポンサーサイト
コメント
この記事へのコメント
C++のspecに明示されていた。。。

5.3.2
The operand of prefix ++ is modified by adding 1, or set to true if it is bool (this use is deprecated).

postfix++は、5.2.6
しかもdecrementはダメと明示されている。。。重箱の隅をつつくさすがC++というかなんというか。。。

-=は、もちろん -1,0,1のimplicit castを繰り返してるけど、やっぱりspec通りみたいに見える。

deprecatedなだけあって、やっぱ意味とかあんーまりなかったんだろうなぁ。。。もしくはtemplate用?あんまり思いつかないけど。。。そういや、op=はJavaPuzzlersにも変な例があったキガスル。
2008/04/04(金) 00:13 | URL | phoenix #-[ 編集]
どうもです。

templateの引数って型とintだけでしたっけ。ならそれかもしれない。

あと-=がそんな挙動になっていたのに気づかなかった。
x(false) -= 1
-> x(0) -= 1
-> x = -1
-> x = true
こういうこと? やっと納得。
2008/04/04(金) 01:12 | URL | Gus #-[ 編集]
任意の非0の値をtrueとしてつかっているコードとか、比較演算子の結果を配列の引数にしているコードのことを考えると、この仕様はしかたがない気がしてきました。

2008/04/04(金) 13:15 | URL | Gus #-[ 編集]
そうそう
false -> 0 -> -1 -> true -> 1 -> 0 -> false -> ...
となってるはず。

templateは、enum/pointer(関数含む)も、spec上はOKの様。
確かにtemplateで++をset trueにするのはわからないことはない気もするけど、なら、--はset falseなんじゃないかなぁ、、、と思ってみたりする。あーでも、そーすると --と -= 1が一致しなくなるのか。。。うーむ、、、難しい。。。
2008/04/05(土) 01:39 | URL | phoenix #-[ 編集]
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://gusmachine.blog49.fc2.com/tb.php/324-39fba4d8
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。