不明白这个for循环是如何工作的

时间:2013-03-26 16:57:58

标签: c

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

//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随着每个循环递增并移动" i"基于* str地址的内存中的位置?

7 个答案:

答案 0 :(得分:6)

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

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

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

所以不要按索引编制索引。你正在移动指针。

答案 1 :(得分:3)

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

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

至于为什么str++移动到下一个字符:这就是如何在指针上定义++。当您递增char*时,将其指向内存中的下一个char大小的单元格。您的*(str + i)解决方案也可以使用,只需输入更多内容(即使它可以缩写为str[i])。

答案 2 :(得分:2)

此for循环使用pointer arithmetic。有了这个,您可以递增/递减指针或向其添加/减去偏移量以导航到数组中的某些条目,因为数组是连续的内存块,您可以这样做。

str指向一个字符串。 C中的字符串始终以终止\0结尾。

*str dereferences获取char值的实际指针。

for循环的中断条件相当于:

*str != '\0'

str++

将指针向前移动到下一个元素。

孔for循环相当于:

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

你也可以写为while-loop:

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

答案 3 :(得分:1)

它与C如何将值转换为“True”和“False”有关。在C中,0是“假”而其他任何东西都是“真”

由于null(字符)恰好也为零,因此它的计算结果为“False”。如果字符集的定义不同,并且空字符的值为“11”,则上述循环将不起作用!

至于问题的后半部分,指针指向内存中的“位置”。递增该指针使其指向内存中的下一个“位置”。指针的类型在这里也是相关的,因为“下一个”位置取决于指向的东西有多大

答案 4 :(得分: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是一个指针变量,它包含字符串文字的地址.Initially 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.
{
}

答案 5 :(得分:0)

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

这可能只是因为C将0视为虚假而其他所有事情都是真实的。

例如,在以下代码中。

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

false将是输出

答案 6 :(得分:0)

一元*运算符是解除引用运算符 - *str表示&#34; str指向的值。&#34; str是一个指针,因此使用str++(或++str)递增它会将指针更改为指向下一个字符。所以这是在for循环中递增的正确方法。

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