C++で逆順forループするときにsize_tを使ってハマった話 - 8月 26, 2018 こんにちは、ぐぐりら(@guglilac)です。 ## 概要 ```c++ for (size_t i = 10; i >= 0; i--) { } ``` ってして、10から0まで降順に走査しようとしたらバグりちらかした ```c++ for (int i = 10; i >= 0; i--) { } ``` こうするといけた. そもそもsize_tについてなんもしらないけどatomでforって入力すると予測変換ででてくるので使っていました。 で、今回逆順にループを回す処理を書いてみたらバグったわけです。 ## 原因 まあ簡単なことで、ブログに書くほどのことでもないんだろうけど、勉強し始めなので一つ一つ基礎的なことも書いていこうと思います。 `size_t`は0以上の整数をとることができる型で、オブジェクトのサイズとかを調べるメソッドとかの返り値がこの型みたい。 なので、size_t型が0より小さい値を取ろうとするとどうなるのか。 試してみると、これがかえってきました ``` 18446744073709551615 ``` 逆に、size_t型の`18446744073709551615`に1足すと0が返ってきます。 size_t型の最大値がこれの値なんでしょうかね。 なので、逆順のループの件に戻ると、i=0の次にi--を行うとi=-1にならずに`18446744073709551615`になるので、永遠にi>=0であり続けてループから抜けられません。 intはもちろん負の数もとることができるのでループがとまるんですね。 なんでatomのデフォルトでforのインデックスがsize_tなんですかね。 この記事をシェアする Twitter Facebook Google+ B!はてブ Pocket Feedly コメント
コメント
コメントを投稿