C Don';我不明白这个for循环是如何工作的

C Don';我不明白这个for循环是如何工作的,c,C,有人能解释一下这个循环是如何工作的吗?整个函数用于计算哈希中放置某些字符串的位置,代码如下: //determine string location in hash int hash(char* str) { int size = 100; int sum; for(; *str; str++) sum += *str; return sum % size; } 它似乎一个字符一个字符地迭代字符串,直到它达到null,但是为什么simple*

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

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

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

    return sum % size;
}

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

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

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


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

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

因此(;*str;str++)的
将迭代,直到
*str
为零。(或nul)

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

why does simple *str works as a condition? 

因此,不是按索引索引。您正在移动指针。

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

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

例如,在下面的代码中

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

false
将是输出

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

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


至于问题的后半部分,一个指针指向内存中的“位置”。增加该指针使其指向内存中的下一个“位置”。指针的类型在这里也是相关的,因为“下一个”位置取决于被指向的对象有多大。使用它,您可以增加/减少指针或添加/减去指针的偏移量,以导航到数组中的某些条目,因为数组是连续的内存块,所以您可以这样做

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

*str
获取字符值的实际指针

for循环的中断条件等效于:

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

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

回路的孔相当于:

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

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

任何整数值都可以视为布尔值
*str
作为for循环的条件,获取
str
指向的值,并确定它是否为非零。如果是这样,循环在遇到空字符时继续,循环终止

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.
{
}

您了解一元
*
运算符的功能吗?我觉得你没有,你把指针弄混了。指向空字符的指针将计算为“True”,因为它不是空指针。如果取消引用该指针,则计算的字符为null。空字符将计算为“false”,因为在C中,0为“false”