アプリ版:「スタンプのみでお礼する」機能のリリースについて

オライリーC実践プログラミングのP203、例13-11の例で質問です。
このプログラムでは一時的なファイル名を返す関数、tmp_nameがあるのですが
このプログラム中の以下の行がよく分かりません。
name[3] = sequence + '0';

直感的にsequenceだけでよさそうな気がするのですが以下のように書き直すと
出力結果にsequenceの数字がでずただ"tmp"と出力されるだけでした。
name[3] = sequence;


char型にint型を使うための手段なのでしょうか?
下記にプログラム全体を載せておきます。よろしくお願いします。

#include <stdio.h>
#include <string.h>

char *tmp_name(void)
{
static char name[30];
static int sequence = 0;

++sequence;

strcpy(name, "tmp");

name[3] = sequence + '0';
name[4] = '\0';

return (name);

}

int main()
{
char *tmp_name(void);

printf("%s\n", tmp_name());

return (0);
}

A 回答 (3件)

これは、0から9までの数値をそれに対応する文字に変換するお手軽かつ問題のある手法です。



ご存知かもしれませんが、コンピューターでは文字は内部的には対応する数値で表されています。
ですから、C/C++ではchar形の中にあるのは文字ではなくその文字に対応する数値です。
したがって、
sequence + '0'
は0という文字を表す数値にsequenceを足した値になります。文字と数値の対応はたいてい0という文字の次に1, 2, ..., 9と続くようになっていますので、結果、sequenceが0なら0という文字を表す数値、sequenceが1なら1という文字を表す数値、…という値になります。
参考キーワードとして「ASCIIコード」を調べるといいでしょう。

数値から文字への変換がたった1回の足し算で出来る、とってもお手軽な方法ですよね?

でも、以下のように問題があるのであまり使わないほうがいい方法です。

・0から9までしか使えない
上で書いたとおり、この方法でsequenceが0なら0という文字に、1なら1という文字に変換できます。……では、sequenceが-1だったら?10だったら?

・そもそも前提に疑問が残る
文字と数値の対応はたいてい0という文字の次に1, 2, ..., 9と続くようになっています。……でもあなたの処理系で本当に連続して並んでいますか?将来そのように並んでない処理系への移植がないと100%言い切れますか?
    • good
    • 0

>あなたの処理系で本当に連続して並んでいますか?


'0'~'9'の文字コードがこの順で連続していることは、Cの規格で保証されている。
    • good
    • 0

僕は十分C言語の知識があるわけじゃないけど…例えば、こう書けばわかるだろうか?



http://ideone.com/BzD4f

tmp65じゃないよ?

http://ideone.com/ilTLE

tmp10じゃないよ?

自信はないけど、tmp10とかにしたかったらこうなるんじゃないかと。
http://ideone.com/XwpqO

#sprintfとstrcatはそれぞれ、null characterをちゃんと付け足すようだ。
http://www.cplusplus.com/reference/clibrary/cstd …
http://www.cplusplus.com/reference/clibrary/cstr …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!