[英]Why does dereferencing occur only once in this while loop in C/C++? [on hold]
为什么以下片段中的 *str 只取消引用一次? 它采用字符串“a”的第一个字符并不断增加该值,直到它到达 ASCII 表的末尾,这与我在每次条件评估时取消引用它并导致无限循环的期望相反。 即使取消引用从条件移动到循环体,此行为也会发生变化。 GCC 版本 7.4.0 用于测试代码。
int getLen(char *str){
int count=0;
while((*str)++) {
count++;
}
return count;
}
int main(){
char s[]="abc";
printf("length is %d\n",getLen(s));
}
Output:159
它被取消引用 159 次,而不仅仅是一次。
a
的 ASCII 值为97
。 如果你增加159
次,你会得到0
。
(*str)++
不增加str
,它增加str
中的第一个字符。
它不会增加它“直到它到达 ASCII 表的末尾”,它会增加直到它变成0
。 如果您的char
类型是有符号的,这意味着它将它增加到该类型的最大值,然后从最小值(负值)增加到0
。
通常, char
是有符号的 8 位。 在这种情况下,它将增加到127
,下一个值将是-128
,之后它将继续增加直到变为0
。
如果您想使用括号清楚起见,请使用
while (*(str++))
{
count++;
}
那是一样的
while (*str++)
{
count++;
}
术语(*str)++
是问题的根源。 您在*str
周围添加了()
,这确保首先评估*str
并且该值增加。 它永远不会增加str
。 请改用*str++
。
while(*str++) {
count++;
}
表达式(*str)++
表示,首先取消引用str
,然后增加取消引用的值。 它永远不会增加str
本身(指针)。 因此,要回答您的问题,并不是str
仅被取消引用一次,而是在循环中每次都被取消引用,但它永远不会增加,因此取消引用的 memory 每次都是相同的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.