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”