次のコードがあります。
while (*str != '\0')
{
digit = *str - '0';
result = result * radix + digit;
str++;
}
とは*str -'0'
どういう意味ですか?
ASCII 文字 '0' から '9' をそれぞれ整数値 0 から 9 に変換します。*str
(明らかに、これは実際に文字 '0' から '9' のいずれかであると確信している場合にのみ良い考えです。)
* strは、「0」から「9」までの文字値を指す場合がありますが、* strで単純な算術を使用すると、期待どおりに機能しない場合があります。*strが文字「4」を指して「4」+2を実行した場合、「4」のASCII値は52であるため、結果は実際には54になります。したがって、*strから「0」を引くことによってASCII値を次のように変換します。数字。'4'-'0' + 2 = 6
これは、現在の文字から数字のエンコードされた値を減算することにより、文字値*str
を整数に変換します。'0'
整数の値は 0 から 9 の範囲になります。
これは、0 から 9 までの数字が常に隣接する値を使用してエンコードされることを C が保証するため (つまり、 のエンコードされた値は'1'
正確'0' + 1
に であることが保証されるなど) から機能します。
多くの人は、これが何らかの形で ASCII の事実を「悪用」していると考えているようですが、これは、システムのネイティブ エンコーディングに関係なく、C が実行されるすべてのプラットフォームで機能するはずです。
ゼロのアスキー値は char から減算されるため、数字の場合はその位置の数値が返されます。