为什么在C / C ++的while循环中仅取消引用一次?

use*_*602 5 c c++

为什么以下片段中的* 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));
}
Run Code Online (Sandbox Code Playgroud)

输出:159

Sid*_*d S 8

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

的ASCII值a97。如果增加该159时间,则得到0

(*str)++不递增str,而是递增第一个字符str

它不会增加“直到到达ASCII表的末尾”,而是一直增加到0。如果您的char类型是带符号的,则意味着它将其递增到该类型的最大值,然后从最小值(负值)增加到0

通常,带char符号和8位。在这种情况下,它将增加到127,下一个值将是-128,此后它将一直增加直到变为0

如果您想使用括号来说明,请使用

while (*(str++)) 
{
    count++;
}
Run Code Online (Sandbox Code Playgroud)

那和

while (*str++)
{
    count++;
}
Run Code Online (Sandbox Code Playgroud)


R S*_*ahu 6

该术语(*str)++是您问题的根源。()在周围添加了*str,以确保*str先评估该值,然后递增该值。它永远不会增加str。使用*str++代替。

while(*str++) {
    count++;
}
Run Code Online (Sandbox Code Playgroud)


小智 2

该表达式(*str)++表示,str首先取消引用,然后增加取消引用的值。它永远不会增加str自身(指针)。因此,为了回答您的问题,并不是str只取消引用一次,而是每次在循环中都取消引用,但它永远不会增加,因此每次取消引用的内存都是相同的。