入門書に求められる事

アバター
へろりくしょん
記事: 92
登録日時: 14年前
住所: 福岡

入門書に求められる事

投稿記事 by へろりくしょん » 13年前

昨日掲示板で入門書のトピックがあったのですが、たまたま同じシリーズの書籍を持っていたのでお返事したのです。

その際に、要約すると内容はうんこだけど、辞書代わりにならいいんじゃね? という趣旨のお話をしたのですが。

私が持っているのは「改訂 新C言語入門 シニア編」という書籍なのですが、個人的にはちまたで酷評されるほど悪くない本だと思ってます。
確かに内容はうんこです。 嘘ばっかりです。 セキュアのセの字もありません。
この本を読んで、実用的なプログラムが書けるかと聞かれれば、はっきりと否定できます。

ですが、初心者にわかりやすく伝えるためには、多少の語弊もやむなしかと思います。
また、実用的なテクニックよりも、そもそもC言語とは。 という部分に終始してるのも、やっぱり入門書ですから。

ほかの言語を一通り学んだ上で、C言語に手を出そうと言うのであれば、まぁ、お勧めはしない書籍ですが
プログラム未経験者が、C言語から始めてみようとするのであれば、割と良い本だと思います。

えぇ、思ってます。 割と本気で。


で、つい先ほどの事ですが、何気なしにパラパラーっとめくってたのですが。。。


内容は、やっぱりうんこです。


パラパラっとめくって10ページでいきなり出てきました。

CODE:

・名前は英文字または_(下線)ではじまらなければならない
・名前の長さは先頭から31文字までが識別される
・予約語を使ってはいけないが、予約語を含む名前はよい
この名前というのは、識別子の事です。

これはむしろ、逆にアンダースコアから始まっちゃだめ。 ぐらい言い切る方がまだ許せますね。
「~までが識別される」と言い切ってるのは良いとしても、識別子の有効先頭文字数は外部識別子だと6文字です(ANSI-C)


そして23ページ。

32ビット int 型の時は int 幅 == long 幅なので、とか言い切っちゃってます。
これは有りですか? 無しですか? 微妙に無しな気がします。


さらに45ページ。
キーボードから10進数を入力するための関数として。

CODE:

int getd(void)
{
	char s[20];
	gets(s);
	return atoi(s);
}
とか書いてあります。

キーボードからと言い切っちゃってるのは、私的には問題ありません。 しっかしこのコード。これだったらむしろ

CODE:

int getd(void)
{
	int d;
	scanf("%d", &d);
	return d;
}
とした方が清々しいですね。

しかし最低でも、せめて

CODE:

int getd(void)
{
	char s[20];
	scanf("%19s", s);
	return strtol(s, NULL, 10);
}
ぐらいは書いて欲しいものです。
三つ子の魂ではありませんが、こういう学習初期に覚えた事って意外と使い続けたりするんですよね。
入門者に変な癖をつけて欲しく無いものです。


この書籍400ページ以上あるのですが、だいたいこんな調子で最後まで続きます。

入門書において語弊と正確性はトレードオフだとは思いますが、結局のところ良い入門書ってなんでしょうね?

繰り返しになりますが、私はこの本割と好きです。 内容はうんこですが。

ISLe
記事: 2650
登録日時: 14年前

Re: 入門書に求められる事

投稿記事 by ISLe » 13年前

LSI-Cとかで組み込みやる人のための入門書でしょうか。
あるいは専用の処理系がCD-ROMで付いてるとか。

間違いを正されたほうが強く印象に残る気もします。
間違いを正されたときの態度で将来性を見ることができて良いかもしれません。

日本語で書かれた技術書は最終的には間違い探しをするためにあるのではないかと思います。
K&Rも例外では無いですし。

アバター
みけCAT
記事: 6734
登録日時: 14年前

Re: 入門書に求められる事

投稿記事 by みけCAT » 13年前

環境依存かもしれませんが、Ideone、codepadでは32文字目もきちんと認識されました。
http://ideone.com/88zZs
http://codepad.org/2G96b3fh

アバター
へろりくしょん
記事: 92
登録日時: 14年前
住所: 福岡

Re: 入門書に求められる事

投稿記事 by へろりくしょん » 13年前

> ISLe さん。

日本語訳された書籍の誤訳を探すのは、まぁ、分からなくもないですが。
初めから日本語で書かれた書籍の間違いが見つかると、著者の知識・技術力を疑ってしまう訳で。

事、入門書に限って言えば、厳密に解釈するよりも、多少の語弊があろうとも分かりやすく受け入れやすい表現をするべきなのだろうと思います。
あまりうんこなのはうんこですけど、どこまでが許される範囲なんでしょうね。


> みけCAT さん。

ideone とかって ANSI-C でしたっけ? なんか、C99 あたりな気がしなくもないです。

環境依存というよりも、処理系依存ですね。 ANSI-C の場合、内部識別子で最低でも31文字、外部識別子で最低でも6文字を、識別できなければならない。 というのが規格で定められてます。
これら、最低でも識別できなければならない文字数の事を、有効先頭文字数・有意先頭文字数などと言いますが、各処理系はこれを超えて識別可能にしても規格上問題はありません。

ただ、これで何が問題になるかと言うと、移植性に大きく影響します。
規格上は、内部識別子で31文字、外部識別子で6文字を識別できれば、それ以上を識別できなくても、全く問題無いわけです。

void main(void) と同じですね。 規格上は、int main(void) と int main(int, char **) をサポートしなければならないとされています。
しかし、void main(void) をサポートしてはならないなんて規格はどこにも無いわけです。
だからと言って、入門書で void main(void) と書くのは些かどうだろう? という事ですね。

アバター
tk-xleader
記事: 158
登録日時: 14年前

RE: 入門書に求められる事

投稿記事 by tk-xleader » 13年前

へろりあ さんが書きました:32ビット int 型の時は int 幅 == long 幅なので、とか言い切っちゃってます。
これは有りですか? 無しですか? 微妙に無しな気がします。
なしです。LP64モデル環境では、int=32bit long=64bitになります。
規格では、sizeof(int)<=sizeof(long)であることのみが保証されます。
最後に編集したユーザー tk-xleader on 2011年12月23日(金) 12:28 [ 編集 1 回目 ]

アバター
へろりくしょん
記事: 92
登録日時: 14年前
住所: 福岡

Re: 入門書に求められる事

投稿記事 by へろりくしょん » 13年前

> tkmakwins15 さん。

まぁ、やっぱり無しですよね。
ただ、入門者にデータ型モデルの説明をしても余計に混乱させるだけですし、規格に厳密な入門書というのもどうかという気もします。
個人的には、この部分は微妙に線引きが難しいところかと。

ちなみに、アンダースコアから始まる識別子は使っちゃダメ。 と言い切るのは、有りですか? 無しですか?

規格ではアンダースコアから始まり、大文字英字もしくはアンダースコアと続くあらゆる識別子は、予約されていて使う事は許されません。
また、それ以外のアンダースコアから始まる識別子は、タグ名を除きファイル有効範囲で使う事は許されません。

上記以外の条件下でしたら、アンダースコアから始まる識別子を使う事は許されるわけですが、事ほど左様に面倒なルールがありますので、
少々乱暴ですが、学習初期からアンダースコアから始まる識別子は使うな。 と教える事はそれなりに有効では無いかと思う訳です。

ただ、アンダースコアから始まる識別子は絶対に使ってはいけないかと言うと、そーゆー規格は無い訳で。

ここでもし、予約済み識別子がどうたらと言う説明をしだしたら、話はさらに面倒になります。 この辺どうなんでしょう。

アバター
tk-xleader
記事: 158
登録日時: 14年前

RE: 入門書に求められる事

投稿記事 by tk-xleader » 13年前

へろりあ さんが書きました:入門者にデータ型モデルの説明をしても余計に混乱させるだけですし、規格に厳密な入門書というのもどうかという気もします。
個人的には、この部分は微妙に線引きが難しいところかと。
Cにおいて一番重要なのは、「企画が定めていないことが多く、処理系依存が結構あるから、規格で保証されている部分とそうでない環境依存の部分をちゃんと分けておくこと。」だと思いますから、規格に厳密であることはそれなりに必要なことだと思いますね。
Windows特有の事柄をさも一般的に当てはまるかのように理解されても困りますからね。
へろりあ さんが書きました:アンダースコアから始まる識別子は使っちゃダメ。 と言い切るのは、有りですか? 無しですか?
微妙なラインですね。嘘を教えるのはさすがにまずいですから、言い切るのは駄目かもしれませんね。
ただ、「_(アンダースコア)から始まる識別子には細かいルールが多いから、使わないほうがいい。」と書くのは有りだと思います。
へろりあ さんが書きました:上記以外の条件下でしたら、アンダースコアから始まる識別子を使う事は許されるわけですが、事ほど左様に面倒なルールがありますので、
少々乱暴ですが、学習初期からアンダースコアから始まる識別子は使うな。 と教える事はそれなりに有効では無いかと思う訳です。

ただ、アンダースコアから始まる識別子は絶対に使ってはいけないかと言うと、そーゆー規格は無い訳で。
アンダースコアから始まる識別子については、さらにややこしいルールがC++11に追加されました。ユーザー定義リテラルでは、何とアンダースコアで始まらないといけないようになったそうです。
本の虫 C++0xの中でいらない機能
まぁ、C言語に限って使うならば、「アンダースコアで始まるのは駄目だ、ルールが複雑だからな。」と言い切ってもいいのではないかと…

アバター
へろりくしょん
記事: 92
登録日時: 14年前
住所: 福岡

Re: 入門書に求められる事

投稿記事 by へろりくしょん » 13年前

なるほど。 大体分かりました。

要約すると、入門書とは、分かりやすい規格の解説書であるべきだ。 と言う事でしょうか。


大筋では私も同じ考えですが、やっぱり入門の書ですから、もう少し、指南書的な側面があってもいいような気がします。

例えば、インデントは必ず揃えなければならない。 とか。
もし、ここで、C言語はフリーフォーマットを採用してますので、任意の書式で記述する事が出来ます。 とか、出来るだけ揃えるようにしましょう。 などと言うのはちょっとどうかと思う訳です。
こういうスタイルは1度癖が付いてしまうと、なかなか抜けないので、学習初期の内から是非ともきっちり揃える癖を付けて欲しいものです。


また、キーボードから10進数を入力する関数の例として、

CODE:

int getd(void)
{
    char s[20];
    gets(s);
    return atoi(s);
}
というコードが載っていたが、最低でも

CODE:

int getd(void)
{
    char s[20];
    scanf("%19s", s);
    return strtol(s, NULL, 10);
}
ぐらいは書いて欲しいとも言いました。

この1つ目のコードも立派なCのコードですが、正直うんこにも劣るコードです。
ぶっちゃけ、こんなコードを書く人が現場にいたら、背後から無言で蹴り入れるレベルです。

標準入力をキーボードと決めつけてるのはまだ良いとして、やっぱり指南書的な面も必要だと思ってますので、こんなコードは書いてはならない。 と教えるのは有りだと思います。


後は、malloc() で確保したら必ず free() を呼び出す。 といった事でしょうか。
これはよく宗教戦争の火種になってますので、ここでこの是非を論じるつもりはありませんが、入門者にこれを徹底させることは、非常に有効では無いかと思います。


上に挙げた事柄は、すべて規格という面から見れば、そんなルールは無い。 というものばかりですが、どれもそれなりに大切な事です。



というわけで、多少の嘘ぐらいなら別にいいんじゃないかな。 って思います。

まぁ、著者の独善的な判断にすべてを委ねてしまうというのが、ちょっと危険と言えば危険な香りがするのは否めませんが。

ISLe
記事: 2650
登録日時: 14年前

Re: 入門書に求められる事

投稿記事 by ISLe » 13年前

ユーザー定義リテラルが識別子ではないというのは関係ないですが。
入門書には余計なことを書かないように、最初に覚えておいてほしいことだけを書くようにすれば、嘘は書かなくて良い気がします。
「Visual C++ではintが32ビット、longも32ビット」というふうに書けばおそらくこれは未来永劫変わらないと思いますし嘘でもありません。
誤解を生まないようにとくどくど書けば大事なことも目に入らなくなります。

ウンチク語る入門書や解説サイトは多いと感じますし、そんなとこにはたいていうんこが混じってますね。