3

誰かがこのループがどのように機能するかを説明できますか?関数全体は、特定の文字列を配置するハッシュの場所を特定するのに役立ち、コードは次のとおりです。

//determine string location in hash
int hash(char* str)
{
    int size = 100;
    int sum;

    for(; *str; str++)
        sum += *str;

    return sum % size;
}

nullに達するまで文字列を文字ごとに繰り返すように見えますが、単純な* strが条件として機能するのはなぜですか?str ++が次の文字に移動するのはなぜですか?代わりに次のようにすべきではありません:*(str + i)ここで、iはループごとに増分し、*strアドレスに基づいてメモリ内の「i」の場所を移動します。

4

7 に答える 7

6

Cでは、文字と整数は暗黙的に次のようにブール値に変換されます。0-false、非ゼロ-true;

したがって、がゼロにfor(; *str; str++)なるまで繰り返します。*str(またはnul)

str文字の配列へのポインタです。str++このポインタをインクリメントして、配列内の次の要素、つまり文字列内の次の文字を指すようにします。

したがって、インデックスでインデックスを作成する代わりに。ポインタを動かしています。

于 2013-03-26T17:00:46.973 に答える
3

ループ内の条件はfor、ゼロ値についてテストされる式です。末尾のNUL文字strはゼロです。

もちろん、この条件のより明示的な形式はですが、がに等しい場合はゼロを生成*str != '\0'するため、これは同等です。!=*str'\0'

なぜstr++次の文字に移動するのかというと、それ++がポインタで定義されている方法です。をインクリメントするときは、メモリ内の次のサイズのセルchar*をポイントします。charあなたの*(str + i)解決策もうまくいくでしょう、それはただより多くのタイピングを必要とします(それは省略可能ですがstr[i])。

于 2013-03-26T17:00:45.527 に答える
2

このforループは、ポインタ演算を利用します。これにより、ポインタをインクリメント/デクリメントしたり、ポインタにオフセットを追加/減算したりして、配列内の特定のエントリに移動できます。配列はメモリの連続ブロックであるため、これを実行できます。

str文字列を指します。の文字列はC常に終了する。で終わります\0

*str 実際のポインタを逆参照してchar値を取得します

forループのブレーク条件は次と同等です。

*str != '\0'

str++

ポインタを次の要素に移動します。

穴のforループは次と同等です。

int len = strlen(str);
int i;
for(i = 0; i < len; i++)
    sum += str[i];

また、whileループのように書くこともできます。

while(*str)
    sum += *str++;
于 2013-03-26T17:07:32.407 に答える
1

これは、Cが値を「True」と「False」に変換する方法と関係があります。Cでは、0は「偽」であり、それ以外は「真」です。

null(文字)もたまたまゼロなので、「False」と評価されます。文字セットの定義が異なり、ヌル文字の値が「11」の場合、上記のループは機能しません。

質問の後半では、ポインタがメモリ内の「場所」を指しています。そのポインタをインクリメントすると、メモリ内の次の「場所」を指すようになります。「次へ」の場所は、ポイントされているものの大きさに依存するため、ポインタのタイプはここでも関係があります

于 2013-03-26T17:01:32.687 に答える
1
Why does str++ moves to the next character, shouldn't it be something like this
instead: *(str+i) where i increments with each loop and moves "i" places in 
memory based on *str address?

C / C ++では、stringは文字列リテラルのアドレスを含むポインタ変数です。最初はStrが最初の文字を指します。*(str)は文字列の最初の文字を返します。

Str ++は2番目の文字を指します。したがって、*(str)は文字列の2番目の文字を返します。

why does simple *str works as a condition? 

すべてのc/c ++文字列にはヌル文字が含まれています。これらのヌル文字は、Cの文字列の終わりを示します。NUL文字のASCIIコードは0です。

In C/C++,0 means FALSE.Thus, NUL Character in Conditional statement 
means FALSE Condition. 

for(;0;)/*0 in conditions means false, hence the loop terminates 
when pointer points to Null Character.
{
}
于 2013-03-26T17:14:03.813 に答える
0

ポインタがヌル文字を指している場合、それはfalseと見なされます。これはポインタで発生します。誰がそれを定義したのかわかりませんが、それは起こります。

Cが0を偽として扱い、他のすべてのものを真として扱うためかもしれません。

たとえば、次のコードで。

if(0) {
           puts("true");
} else {
           puts("false"); 
}

false出力になります

于 2013-03-26T17:01:12.447 に答える
0

単項演算*子は間接参照演算子です- 「。*strが指す値」を意味しstrます。はポインタであるため、 (または)strでインクリメントすると、次の文字を指すようにポインタが変更されます。したがって、forループでインクリメントする正しい方法です。str++++str

任意の整数値をブール値として扱うことができます。*strforループの条件は、が指す値を取り、strそれがゼロ以外であるかどうかを判別するためです。その場合、ループは続行されます。ヌル文字に達すると、ループは終了します。

于 2013-03-26T17:07:48.497 に答える