スポンサーリンク
※サイト運営にサーバーは必須です※
~ ロリポップ! はコスパのよい初心者向けサーバーです~
目次
はじめに
備忘録もかねてどのようなパターンでプログラムがエラーを吐くかメモを残しておく。
※私が今まで使ったことのあるプログラムの環境は「MinGW」と「Visual Studio」
単純な付け忘れ
文章の最後に「;」(カンマ)を付け忘れる。
「;」(カンマ)と「:」(コロン)を間違える。
「{}」(かっこ)がきちんと閉じていない。
※「{」と「}」の数が同じでない
ひらがなモードで空白(space)の挿入。
※Ctrl+Fなどでプログラムの中に、余計な空白がないか検索できる
※「Visual Studio」には、インテリセンス機能がついているので、赤線で警告してくれるからすぐに気づける。
配列のミス
配列は非常にミスをしやすい部分である。
コンパイルがうまくいったのに、実行しようとすると止まるときは、まず配列を疑う。
例えば、c#で、int []array= new int [10];と宣言すると、10個の要素が宣言される。
この場合、配列の中身は、array[0]~array[9]で指定する。
生活をしていると、ほとんど多くの物事は1からスタートしてラベル付けがされる。だが、配列に関しては、0からスタートしてラベル付けされる。このため余計、間違えやすい。つまり、array[0]~array[9]でなく、array[1]~array[10]が存在していると勘違いしてしまいがち。
特に、最大値の部分はうっかりするとミスる。
例えば以下のようなプログラムはバグる。
※「Visual Studio」のコンソールアプリケーションで作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int array_max; array_max= 10; int []array= new int [array_max]; array[array_max] = 100; Console.WriteLine(array[array_max]); } } } |
ハンドルされていない例外: System.IndexOutOfRangeException: インデックスが配列の境界外です。
と警告を受ける
正しいプログラムは以下のようになる。
array[array_max]をarray[array_max-1]にする必要がある
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace error1_OK { class Program { static void Main(string[] args) { int array_max; array_max = 10; int[] array = new int[array_max]; array[array_max-1] = 100; Console.WriteLine(array[array_max-1]); } } } |
数字の切り捨て(キャスト)
int で数字を扱っている時に、割り算が入る場合は要注意。
例えば以下のプログラムでは正しい答えは得られず0になる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace error2 { class Program { static void Main(string[] args) { int x = 50; int y;//消費税 y = x / 100 * 8; Console.WriteLine(x+"円の消費税は" + y+"円"); } } } |
yは4になりそうだが、プログラムの結果は0になる。
これは先に、「x / 100」の部分が評価されているためだ。
50/100は0.5で、intで扱っているため切り捨てられて、0になる。
その後、「*8」して×8をしているが、0に8をかけても0である。
正しくは、以下のように、xを「int」でなく「double」として最初は扱ったのちに、型を「int」に戻す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace error2_ok { class Program { static void Main(string[] args) { int x = 50; int y;//消費税 y = (int) ((double)x /100 * 8); //y = (int)(x * 0.08);//これでも可能 Console.WriteLine(x+"円の消費税は" + y+"円"); } } } |
関連記事
~ギャンブルに絶対儲かる必勝法があるのだろうか?~
私(サイト主)はこの疑問に対して非常に興味を持ち、プログラミングで検証してみました。
このサイトを応援してもいいかなと思う人はぜひとも購入を検討してみてください。