Chironianさんの回答を見て、致命的な間違いに気付きました。
以下の回答は*c++
を(*c)++
と見誤っています。お恥ずかしい...
残骸
質問者様がどこまで理解しているかわからないため、順を追ってお話します。
- 前提1: char型は-256~255の整数値を格納する(範囲は処理系によります)
C
1for(char c = 0; c < 0; c++);
上記のコードは有限回で終了します。255+1が-256と見なされるからです。
- 前提2: C言語では0がfalse,それ以外がtrueと判断される
C
1char c = なんとか;
2if(c) printf("true\n");
3else printf("false\n");
上記のコードでは、cに0を代入したときにfalseが、それ以外のときにtrueが表示されます。
- 前提3: while文の評価部はtrue/false
タイムリーな記事が今日の昼に上がっていました。while(条件式)
である必要はありません。
C
1char c = -200;
2while(c++);
上記のコードは有限回で終了します。
理解があるのであれば説明不要ですが、よくわからないなら次のように読み替えてください。
C
1#define M 257
2int hash(char v){
3 int x;
4 x = 0;
5 while(v)
6 x = 256 * x + (v++);
7 x = x % M;
8 if(x < 0)
9 x = (-x);
10 return(x);
11}
もちろん等価ではありません。しかし、関数内の動作は同じです。
コードのwhile部を見てみましょう。
C
1while(v)
2 x = 256 * x + (v++);
評価する対象はvですね。vは整数型なので、インクリメントし続けるといつか0になります。
ハッシュ関数なので終了条件に明確な意味はありませんが、有限回で終了するのは必須ですね。
転ばぬ先の杖
前提としていくつか挙げましたが、私の説明が規格と合致しない箇所があるかと思います。
看過できない場合は、遠慮なくご指摘ください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/15 11:02
2017/07/15 13:59