入力が の場合123
、ループの各反復で次の計算が行われます。
n = 0 * 10 + ('1' - '0');
n = 1 * 10 + ('2' - '0');
n = 12 * 10 + ('3' - '0');
assert(n == 123);
数字の文字コードは常に連続しており、'1' - '0'
1 なども同様です。
数字の桁を数字に変換します。イディオムに慣れましょう。C コードでよく見かけます。
示されているコードは、さまざまな点でずさんです。
int readuint()
{
int n = 0;
char c = fgetc(stdin);
do {
n = n * 10 + (c - '0');
} while ((c = fgetc(stdin)) != '\n');
return n;
}
名前は符号なし整数 ( uint
) を読み取っていることを示していますが、使用されている型は符号付きint
です。(and and )は ではなく を返すため、 の型は であるc
必要があります。EOF に遭遇したことを示す方法はありません。オーバーフローに対する保護はありません。入力内の数字以外に対する保護はありません。これらすべてを修正するには、かなり多くのコードが必要ですが、コードの基本的な自己保護は、次のようにする必要があることを意味します。int
fgetc()
getc()
getchar()
int
char
int readint(void)
{
int n = 0;
int c;
while ((c = fgetc(stdin) != EOF && isdigit(c))
n = n * 10 + (c - '0');
if (c != EOF && c != '\n')
ungetc(fp, c);
return n;
}
オーバーフローに対する保護はまだありませんが、入力内の EOF および非数字に対する基本的な保護があります (改行または EOF 以外の文字は、次の読み取り操作のために戻すことによって再処理されます)。
'1'-'0' (char) = (int)1
? この変換はどのように行われますか? From char
to int
: 整数コンテナーに割り当てているためint n
ですか?
Elchonon Edelsonが言ったように、'0'
や ' 'などの文字定数は C では1
整数定数であり ( char
C++ では定数になります)、 および の値'0'
は'1'
非常に頻繁にそれぞれ 48 と 49 です (ただし、C 標準では保証されていません! )。だから、もちろん49 - 48
を与えます。1