有人可以解释这个循环是如何工作的吗?整个函数用于确定散列中放置某些字符串的位置,代码如下:
//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地址的内存中的位置?
答案 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
指向的值并确定它是否为非零。如果是这样,循环继续一旦它命中空字符,它就会终止。