LoginSignup
1

More than 5 years have passed since last update.

配列の添え字チェックは自動になったと割り切ろう?

Posted at

前回の投稿に続く:http://qiita.com/chesscommands/items/68d8237eccf5fac05e13
C言語と言えば,ポインタを使うことだと言われている(誰が言う?).
理解するためには勉強しなければならない.
まずは,配列の勉強をすることにした.

しかし,前回は,書籍の内容と少し違う出力結果に出くわし,つまづいた.
つまづいた箇所は,勉強から逸れるため気にしないはずが・・・今回調べることにした.

前回はc89規格でコンパイルをしたが,配列の添え字を自動でチェックしてくれた.
今回はc78のオプションを指定したが,そもそもそんなオプションはないと言われてエラーになった.

c78.jpg

JIS規格

X 3010:2003 (ISO/IEC 9899:1999)のP61に,配列の範囲参照に関する説明を見つけた.
一生懸命説明してくれているのは分かる.しかし,内容は全然分からない.
http://kikakurui.com/x3/X3010-2003-01.html

JIS.jpg

結局何が言いたいのだろうか.

wikipedia

ウィキペディアでは,配列の範囲外を参照した場合,何もチェックしないため,どうなるか分からないと記述してあったのだが・・・.
https://ja.wikipedia.org/wiki/C言語

配列の自動チェック.jpg

チェックしないプログラミングの説明なのか?
そんな馬鹿な.

勉強できず

こんな下らないことに時間と労力を費やすのは間違っている.
しかし,規格を理解できずに勉強を進めると言うことは,本格的に使うプログラムを作る場合,その時のコンパイラに合わせたプログラムを組むことになる.
そんなことをしては,時間と労力がそれこそ途方もなく掛かってしまう(そのコンパイラを調べるわけだからな).
規格を理解しておけば,応用が利くと思ったのだが・・・.
そもそも生粋のC言語コンパイラではないのが原因か?

今回の勉強

書籍には,C言語の配列チェックは現時点でできないとの記載があった.
15年以上前の書籍だからなのか・・・時代は変わるものだとつくづく実感する.
そして,勉強を進めることで,配列の表記に[ ]を使っており,これは簡便記法(syntax sugar)ということがわかった.
本来のC言語で配列を表すのは,アスタリスクや丸括弧で表現するのが正しいようだ.
 本来:*(temp + i)
 簡便:temp[ i ]

本来の表記.jpg

16行目の部分は,コンパイル時に警告が出なかった(簡便記法の17行目が警告されただけで終わった).
添え字チェックは,コンパイラか何かが勝手にやったことなのだろうと結論づけた.
しかし,勉強のために配列外へのアクセスをするだけで,ここまで書籍から離れるプログラミングは間違っているように思う.
それでもここまで脇道に逸れた理由は,配列の添え字チェックが当たり前と思ってプログラミングした場合,意図しない箇所でのバグに対処することを想定したからだ(ただのこじ付け).

先日の投稿に,何がしたいのかわからないとコメントをもらった.
確かに,ここまでプログラムを書き換えたら,自分でもやりたい目的を忘れてしまう.
たかが配列の範疇を越えたアクセスをするはずだったのに,勉強の範疇を越えるとは思わなかった.
こんな突飛なことをするから就職先が決まらないのだろう.
今後の私は大丈夫か!?

そもそも書籍通りに進めるための勉強が何になるかと言われても勉強のためとしか言えない.
何より,歴史の勉強などもそうだろう.覆るかもしれない歴史を勉強して何になるのかと・・・.
極端なことを言えば,死ぬことが分かっている人間が勉強して何になるのかと・・・.

C言語の配列の勉強が哲学の話に・・・ならないか.

結論

なぜ,未定義部分を実行(表示)させたいのかという問いに対しての応えは,そこに未定義がある限り...
もとい,暇だから.
勉強する必要に迫られているが,そこまで切羽詰まっていないため,脇道に逸れにそれているというのが本音になる.

さらに言えば,未定義を再現したいのではなく,最終的にポインタを理解したい.
しかし,どこまで勉強すれば良いのか分からないため,書籍通りに進めようと思ったが,脇道部分に躓いてしまった.というのが今回の経緯・・・かな.

参考URL

C99:https://ja.wikipedia.org/wiki/C99
C言語のバージョン:http://portable-c.jugem.jp/?eid=3
Cはパンクロックだ:http://qiita.com/jj1bdx/items/135d650255e8f870a20e
バグ回避:http://qiita.com/Ki4mTaria/items/b6ab0bcbe9c87d4dc071
バグ回避?:http://www.g-ishihara.com/c_ar_02.htm
添え字の確認:http://kaworu.jpn.org/c/配列の要素数を調べる
配列の添字に関する重要な注意事項:http://www.cc.kyoto-su.ac.jp/~yamada/programming/array.html

余談

冒頭のc78は,ギャグで使われていることに便乗した.
https://www.ibm.com
C78説明.jpg
※文字列範囲選択(反転)は私がしたもの.

以上.

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1