入力が の場合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 に遭遇したことを示す方法はありません。オーバーフローに対する保護はありません。入力内の数字以外に対する保護はありません。これらすべてを修正するには、かなり多くのコードが必要ですが、コードの基本的な自己保護は、次のようにする必要があることを意味します。intfgetc()getc()getchar()intchar
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 charto int: 整数コンテナーに割り当てているためint nですか?
Elchonon Edelsonが言ったように、'0'や ' 'などの文字定数は C では1整数定数であり ( charC++ では定数になります)、 および の値'0'は'1'非常に頻繁にそれぞれ 48 と 49 です (ただし、C 標準では保証されていません! )。だから、もちろん49 - 48を与えます。1