わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

1e-10は定数,でも-10は定数ではない?

 いきなりですが問題です.以下のうち,Cにおいて「定数」となるのは,どれでしょうか?

  • 「#define RED 1」と書いたときのRED
  • 「const int c = -10;」と宣言したときのc
  • 「const int c = -10;」における-10
  • 「"hello, world\n"」のような文字列定数

 さっそくですが解答です.「プログラム言語C」の規格(JIS X 3010:2003)を根拠とすると,上記はいずれも「定数」ではありません.
 この規格の冊子体を,税込13,200円*1で購入するのは高すぎます.しかしながらブラウザを使って,無償で(かつ合法的に)参照することが可能です.https://www.jisc.go.jpにアクセスして,「JIS検索」に移り,「JIS規格番号からJISを検索」のところに「X 3010」を記入すれば,出てきます.PDFは別ウィンドウでリンクされ,「JISの閲覧は可能ですが、印刷・購入はできません」となっています.
 この文書を先頭から読んでいくのは大変ですので,定数の解説に,ジャンプしましょう.別ウィンドウで表示された分*2について,ページを「43」に変更し,Enterを押しましょう.右上のページ番号が「39」に変わり*3,ページの真ん中に「6.4.4 定数」が出れば,成功です.
 そこで書かれているとおり,定数とは「整数定数」「浮動小数点定数」「列挙定数*4」「文字定数」のいずれかです*5.冒頭の問題をチェックすると,RED(オブジェクト形式マクロ,6.10.3,p.115),const int c(修飾子,6.2.5,p.27),そして文字列定数(文字列リテラル,6.4.5,p.45)はいずれも,定数でないことになります.
 「-10」は定数になるかどうかですが,pp.39-40の構文規則を読むと,符号が出てきません.実際のところ「-10」は,整数定数の「10」をオペランドとして,単項-演算子(6.5.3.3,p.58)を適用した結果となります.
 浮動小数点定数(6.4.4.2,p.41)の構文規則には,「符号」が出現しますが,「指数部」を表すためにのみ使用しています.例えば「1e-10」は,10進浮動小数点定数であり,したがって浮動小数点定数となります.その一方で「-0.1」は,「-10」と同様の理由で,定数ではないというわけです.
 これらは規格に基づく話です.授業の先生と生徒のやりとりや,学校を離れた実務的なコーディングにおいては,REDも"RED"も,const int cも-10も,「定数」となるはずです.
 学部1年生を対象としたプログラミング科目で,予習の課題として「数学の変数」「数学の定数」「Cの変数」「Cの定数」を調査してもらいました.授業では前三者を取り上げました.「Cの定数」について,上記の規格外定数を含め,さまざまな答案があったのでした.

*1:https://webdesk.jsa.or.jp/books/W11M0090/index/?bunsyo_id=JIS%20X%203010:2003

*2:上部に「2019年7月1日の法改正により名称が変わりました。前書きを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。」と出ました.

*3:ブラウザ表示において,PDFのページ番号+4で,見たいページに移動できます.

*4:enum color { RED, GREEN, BLUE };と宣言したときのRED,GREEN,BLUEが該当します.このときREDは1と等しくなります.数学の定数は,整数でも実数でも差し支えありませんが,Cの列挙定数は必ずint型となります.

*5:https://takehikom.hateblo.jp/entry/20140807/1407420548でも,指摘していました.