-1

答えの一部しか知らないプログラミングの質問に出くわしました。

int f( char *p )
{
int n = 0 ;
while ( *p != 0 )
n = 10*n + *p++ - '0' ;
return n ;
}

これがプログラムが行っていることだと思います。p はポインターであり、while ループはポインターの値が 0 になるまで DE-refrencing しています。ただし、n 代入行がわかりません。'0' は何をしているのですか? p の値は最初は負であると想定しています。これが、インクリメント後に 0 に達する唯一の方法です。

4

4 に答える 4

3

数字のゼロ (なし、何もない) と文字0(円、おそらくスラッシュを含む) を混同しています。ゼロは目盛りにあることに注意してください。つまり、数字のゼロではなく、文字「0」です。

'0' - '0' = 0
'1' - '0' = 1
'2' - '0' = 2
...

したがって、数字から文字ゼロを引くと、その数字に対応する数字が得られます。

たとえば、「4」、「2」、「1」という一連の数字があるとします。そこからどうやって四百二十一という数字を得るのですか? 「4」を 4 にします。次に、10 倍します。これで 40 個になりました。「2」を 2 つに変換して追加します。これで 42 個になりました。10 倍します。「1」を 1 に変換して足すと、421 になります。

これが一連の数字を数値に変換する方法です。

于 2012-12-04T01:47:55.643 に答える
2

ローカル変数は、このn関数に渡された 10 進数の値を文字列に累積します。atoiこれは、有効性チェックなしのの実装です。

ループ本体の仕組みは次のとおりです。

n = 10*n + *p++ - ‘0';

nの前の値にn10 を掛けた結果に、ポインターの現在の文字コードpからゼロのコードを差し引いた値を代入します。逆参照p 後にインクリメントします。

数字文字は順番にエンコードされるため、*p-'0'式は数字の 10 進数値を表します。

string を解析しているとしましょう"987"。ループを通過するとn、ゼロから始まります。次に、次の値が割り当てられます。

n = 10*0 + 9;  // That's 9
n = 10*9 + 8;  // That's 98
n = 10*98 + 7; // That's 987
于 2012-12-04T01:41:31.543 に答える
1

これは文字列から数値への変換関数です。アトイに似ている。

文字列は一連の文字です。したがって、メモリ内の「123」は次のようになります: '1','2','3',NULL

p それを指します。

現在、ASCII によると、数字は '0' から '9' にエンコードされています。「0」には値 48 が割り当てられ、「9」には値 57 が割り当てられます。そのため、メモリ内の「1」、「2」、「3」、NULL は実際には : 49、50、51、0 です。

文字 '0' を整数 0 に変換する場合は、メモリ内の値から 48 を引く必要があります。これがどこに向かっているのか分かりますか?

ここで、数値 48 を減算する代わりに、'0' を減算します。これにより、コードが読みやすくなります。

于 2012-12-04T01:59:02.110 に答える
1
于 2012-12-04T01:53:26.530 に答える