第1章 まずは慣れよう

テキスト『新・明解C言語 入門編 第2版』第1章の内容に関する補足説明を提供します. 第1版で学習しても問題ありませんが,セクション構成がわずかに異なります.

1-1 まずは表示を行う

整数の加算の結果を表示

このセクションについての補足説明は現在のところありません. プログラムの作成と実行 において, List 1-1 を例に,ソースファイルを書き,コンパイルし, 実行プログラムを実行するまでの手順を解説しました.

プログラムとコンパイル

このセクションについての補足説明は現在のところありません. プログラムの作成と実行 において, List 1-1 を例に,ソースファイルを書き,コンパイルし, 実行プログラムを実行するまでの手順を解説しました.

注釈(コメント)

C言語の学習の補助のために, ソースプログラムの中にいろいろ注釈(コメント)を書いておくことは問題ありません. むしろそうすべきでしょう. しかし,仕事で作成する実際のプログラムは, 注釈をたくさん入れた方がよいというわけではありません. プログラマが見ればすぐに意味のわかることまで注釈を入れる必要はありません. たとえば,List 1-1 での


/* 整数値15と37を加えた結果を10進数で表示 */

という注釈(第1版)あるいは


// 整数値15と37を加えた結果を10進数で表示

という注釈は,学習の補助のために入れられているものであり, プログラマが実際に作成するプログラムでは不要です.

注釈は厄介な問題を引き起こすことがあります. 注釈とプログラムの内容とに齟齬が生じることがあるからです. このようなことが起こるのは,典型的には, ソースプログラムで注釈が入っている部分を修正し, 注釈を書き換えなかったときです. 不具合を修正して安心し, もともと入っていた注釈がプログラムの内容に合わなくなったのに, 注釈の修正を忘れるわけです. やたらと注釈を書くべきでないということに関して,

藤本裕之 (2004) 叫ぶ!Cプログラマ ソーテック社

の第5章3節「コメントまたはファイル名が無効です」(p.136~)や,

前橋和弥 (2001) C言語 体当たり学習徹底入門 技術評論社

の p.88-90 のコラム「コメントの功罪」の主張は説得的です.

プログラムの決まり文句

このセクションについての補足説明は現在のところありません.

printf 関数:書式化して表示を行う関数

このセクションについての補足説明は現在のところありません.

このセクションについての補足説明は現在のところありません.

整数の減算の結果を表示

このセクションについての補足説明は現在のところありません.

書式文字列と変換指定

printf 関数の仕様は p.376(第1版では p.354)から4ページにわたって示されています. これは仕様書なので,今読んでも意味のわからないところだらけでしょう. それでも,printf 関数について何か新しいことを学ぶたびに, それと関連する部分だけでも目を通してください. たとえば,今の段階でも, 第1版で仕様の最初に述べられている次の文の意味はほぼ理解できると思います. (第2版では,この部分の記述はとても簡単に書き直されています.)

format に続く実引数を,文字の並びである出力形式に変換して, 標準出力ストリームへ出力する. その変換は,format が指す書式文字列内の指令にしたがう.

この記述での format は,printf 関数に与えられる 書式文字列(format string)のことです. 標準出力ストリーム(standard output stream) とは,コンピュータのスクリーンのことです. 書式文字列に含まれる,変換指定以外の部分(通常の文字)は, スクリーンにそのまま出力されます. 書式文字列に続く実引数は, 書式文字列内での指令(すなわち,変換指定)にしたがって, スクリーンに出力されます. 細かいことですが,スクリーンに出力されるのは文字です. たとえば,List 1-3 で出力される 52 という数字は, スクリーンに文字として出力されています.

仕様書での変換指定についての記述のうち, 変換指定子 d についての説明(第1版 p.356,第2版 p.378)も, 精度についての説明以外はほぼ理解できると思います.

記号文字の読み方

このセクションについての補足説明は現在のところありません.

書式化を行わない表示

このセクションについての補足説明は現在のところありません.

文字列リテラル

このセクションについての補足説明は現在のところありません. 文字列リテラルについては,第9章と第11章で詳しく扱います.

拡張表記

拡張表記の一覧は第8章の Table 8-3(第1版 p.235,第2版 p.250)にあります. このテキストで実際に扱うのはこの表の一部です.

演習室の環境では,音声出力がオフにされているので, List 1-7 の警報(alrert)は聞こえなくなっています.

このセクションで演習問題が初めて出てきましたね. 演習問題の解答はテキストには与えられていません. テキストと同じ著者による『新・解きながら学ぶC言語』には, すべての演習問題の解答が収録されています. 必要であれば参照してください.

1-2 変数

変数と宣言

このセクションについての補足説明は現在のところありません.

代入

このセクションについての補足説明は現在のところありません.

初期化

情報基盤センター大演習室の環境で List 1-9 を実行すると下図のようになりました. エラーは出ませんでした. テキストの説明にあるとおり,変数に不定値が入れられたことがわかります。

List 1-9 の実行結果

演習1-4 は List 1-10 を少し改変すればよいでしょう. 変数 x(第1版は vx)の初期化を行っている部分を,


int x = 3.14;   // ここを List 1-10 から変更
int y = x + 12; // List 1-10 のまま.第1版では vy = vx + 10

と変更して,ソースファイルを別名(たとえば,ex0104.c)で保存します. Emacs では,List 1-10 のソースファイルを開いて編集し, その後 C-x C-w で別名保存します. ここで C-x C-w という表記は, コントロールキーを押しながら [x] キーを押し,続いて, コントロールキーを押しながら [w] キーを押す操作を意味します.

ファイルを保存したらコンパイルしましょう. すると,下図のように警告が出ます.

演習 1-4 コンパイルでの Warning

変数 x は int 型として宣言されているのに, 初期化子が 3.14 という実数であるため,この警告が出ます. 初期化子として与えられた実数 3.14 は, 第2章で学習するように,実数型の数値です. この実数値は, そのままでは変数 x(整数型)の初期値にはできないので, 小数点以下が切り捨てられます.実数型が整数型に変換されるわけです. これを暗黙の型変換(implicit conversion)と呼びます. この語句が警告メッセージ中にありますね. 詳しくはテキスト第2章(第1版 p.32,第2版 p.34)で学習します.

コンパイルでは警告が出ますが,実行ファイルは作成されます. 実行してみると問題なく動作しますが, 暗黙の型変換が行われていることがわかります. 下図のように,x の値が3になっています.

演習 1-4 実行

実数型から整数型への暗黙の型変換では,小数点以下は四捨五入ではなく, 切り捨てられます. 変数 x の初期化子を 58.99 に変えて実行したのが下図です. x の値は58になっていますね.

演習 1-4 値を変えて実行

初期化でなく, int 型の変数に実数を代入する類題が List 2-6(第1版 p.29,第2版 p.31)にあります.

1-3 読込みと表示

scanf 関数:キーボードからの読込みを行う関数

List 1-11 を実行して整数(たとえば,37)を入力すると, 「あなたは37と入力しましたね」と表示される前に改行が入ります. これは scanf 関数あるいは printf 関数の動作ではなく, 数値を入力したあとに [Enter] キーを押したためです.

Windwos の Visual Studio で List 1-11 をコンパイルすると, 下図のようにエラーになります.

Windows での scanf のエラー

これは,Visual Studuio では scanf 関数の使用が非推奨となっているためです. 手っ取り早く修正するには,scanf 関数のかわりに scanf_s 関数を使います. これは Microsoft が scanf 関数のかわりに用意した関数です.

List 1-11 のプログラムで, 最初の printf 関数での書式文字列の最後に, 改行の指示(\n)は必要ありません. スクリーンで「整数を入力してください:」と表示されたすぐ右側に, 数値を入力するためです. 数値(たとえば,37)を入力して [Return] キーを押すと, 自動的に改行され,「あなたは37と入力しましたね。」と出力されます. なお,こうして自動的に改行が入るのは, 数値入力の後に [Return] キーを押したためではありません. scanf 関数の動作です.

scanf 関数にはいろいろな問題点があります. どのような問題点があるかは,ウェブ検索してみれば簡単に見つかります. そのため, プログラマにこの関数の使用を禁止しているソフトウェア開発会社もあるようです. しかし,C言語の学習を始めたばかりの段階では, scanf 関数を使わざるを得ません.代替手段を取るためには, これから先で学習するさまざまな知識が要求されてしまうからです.

List 1-11 のプログラムを,scanf 関数を用いないで最小限の書き直しを行うと, 下図のようになります. このプログラムは,今の段階では理解する必要はありません.

List 1-11 scanf 関数を使わない修正

ただし,scanf 関数を使うことが絶対によくないのかというと, そうとも言えません. 今の学習段階では無理ですが,この関数の問題点をよく知り, 適切な対策を行えばよいからです.

まだテキストの第1章なのに,ちょっと難しい話を始めてしまいました. この続きは,このテキストをマスターしたころに, 以下の書籍を読んでみてください.

高木信尚 (2011) C/C++ プログラミングの「迷信」と「誤解」 技術評論社

乗算を行う

このセクションについての補足説明は現在のところありません.

puts 関数:表示を行う関数

printf("ABCDE\n"); と puts("ABCDE"); は「ほぼ」同じと説明されていますが, この例でのスクリーンへの出力は完全に同一です. 使用している関数が異なるので,実行ファイルの内容は異なったものになります.

puts 関数では, printf 関数での変換指定で使用する記号 % をそのまま出力します. 拡張表記(\n など)は puts 関数でも有効です. たとえば,


puts("AB%dC\nD");

という文での出力は


AB%dC
D

となります.文字列の最後の D が出力された後,改行が入ります.