いきなりですが問題だよこのコードは.
C言語のプログラムでは,幅広いスペースや空行はコンパイル時に無視され,プログラムの実行に影響しません。この自由度を利用して,プログラムの構造がみえるようにします。いわゆる,Cプログラムらしいプログラムとは,このようなプログラムのことをいいます。
(例)#include <stdio.h> int main(void){ int k, N; double k, m, N; N=10; for(k=1;k<N;k++){ if(k % 2 == 0){ printf("k=%d \n", k); } } return 0; }
さてえっと,まず,このプログラムはコンパイル時にエラーが発生します.というのも変数kとNが重複して,main関数内に宣言されているからです.変数mが使用されていないことから,「double k, m, N;」の行を丸ごと削除すれば,この件は解決しそうです.
しかし「Cプログラムらしいプログラム」かというと,引っかかるところがあります.「N」という名前の変数です.処理を見ていくと,「N=10;」と代入してから,Nの値はまったく変化していません.変数ではなく定数です.Cでは,#defineのオブジェクト形式マクロを使うべきところです.そしてmain関数より上で宣言します.
あとは,見た目の問題です.インデント(字下げ)が最初のレベルは5文字の空白,あとは3文字というのは,ずいぶんと謎な書き方です."k=%d \n"と,改行の前にスペースがあるのも意味不明です.forやifと開きカッコとの間には空白を置くようにして,関数呼び出しと制御文とを書き分けたいところです.
空行は,まず,#includeとmainの間にほしいし,main関数内でも,関数終了のreturn文の直前に入れておきたいものです.
その他もろもろ,修正していくと,次のようになりました.
/* even.c : N未満の正の偶数を出力 */ #include <stdio.h> #define N 10 int main(void) { int k; for (k = 1; k < N; k++) { if (k % 2 == 0) { printf("k=%d\n", k); } } return 0; }
といったところで元ネタです.
- 作者: 首藤健一,中津川博,松井和己,蔵本哲治,眞銅雅子
- 出版社/メーカー: 培風館
- 発売日: 2013/05/01
- メディア: 単行本
- この商品を含むブログを見る
shadowboxで囲まれていることから(また本文全体からも),TeXで書かれたのが想像できます.他のページのソースファイルには,おかしなインデントが見当たらなかったので,ここだけ別の方法で作成したものと思われます.
それでも,文字列リテラル中の「\n」の直前の空白文字は,意味不明です.引用しなかった同ページ下部には,インデントなしのソースコードがあるのですが,そこでも"k=%d \n"と空いています.
書店でこの本を見かけたとき,練習問題が多く入っており,自分の授業に取り入れようかなと思ったのですが,帰宅してじっくり読んでみると,「...変数のバイト数は,sizeof(変数名)演算子を使って...」(p.21脚注)だとか「変数aが...整数型から倍精度浮動小数点型に型変換」(p.22)だとか,「幅広いスペース」だとか,細かいところが気になってきました.順に「sizeof演算子」「変数aの値」「スペースやタブ」だったら,違和感がなかったのですが.