3

有人可以解释这个循环是如何工作的吗?整个函数用于找出在哈希中放置某些字符串的位置,代码如下:

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

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

    return sum % size;
}

它似乎逐个字符地迭代字符串,直到它达到空值,但是为什么简单的 *str 可以作为条件工作?为什么 str++ 会移动到下一个字符,它不应该是这样的:*(str+i) 其中 i 随每个循环递增并根据 *str 地址移动内存中的“i”位置?

4

7 回答 7

6

在 C 中,字符和整数隐式转换为布尔值:0 - 假,非零 - 真;

所以for(; *str; str++)迭代直到*str为零。(或无)

str是一个指向字符数组的指针。str++递增此指针以指向数组中的下一个元素,因此指向字符串中的下一个字符。

所以不是按索引索引。您正在移动指针。

于 2013-03-26T17:00:46.973 回答
3

循环中的条件for是一个测试零值的表达式。末尾的 NUL 字符str为零。

这个条件的更明确的形式当然是*str != '\0',但这是等价的,因为当等于!=时产生零。*str'\0'

至于为什么str++移动到下一个字符:这++就是在指针上定义的方式。当你增加 achar*时,你将它指向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++ 指向第二个字符。因此 *(str) 返回字符串的第二个字符。

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

当指针指向一个空字符时,它被认为是假的。这发生在指针中。我不知道是谁定义的,但它确实发生了。

这可能只是因为 C 将 0 视为假,而将其他所有事物视为真。

例如在下面的代码中。

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

false将是输出

于 2013-03-26T17:01:12.447 回答
0

一元*操作符是一个解引用操作符——*str意思是“指向的值str”。str是一个指针,所以用str++(或++str)递增它会将指针更改为指向下一个字符。所以这是在for循环中递增的正确方法。

任何整数值都可以视为布尔值。*str因为for循环的条件采用指向的值str并确定它是否非零。如果是这样,则循环继续。一旦遇到空字符,它就会终止。

于 2013-03-26T17:07:48.497 回答