为什么在C/C++中的while循环中只发生一次取消引用

Why does dereferencing occur only once in this while loop in C/C++?

本文关键字:引用 取消 一次 C++ 中的 循环 while 为什么      更新时间:2023-10-16

为什么以下片段中的*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 %dn",getLen(s));
}

输出:159

它被取消引用159次,而不仅仅是一次。

a的ASCII值为97。如果将159增加3倍,则得到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只被取消引用一次,而是在循环中每次都被取消引用,但它从未增加,因此每次取消引用的内存都是相同的。