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

问题描述 投票:3回答:3

为什么以下片段中的* 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
c++ c
3个回答
1
投票

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


5
投票

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

while(*str++) {
    count++;
}

4
投票

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

a的ASCII值为97。如果将159递增1,则得到0

[(*str)++不递增str,它递增str中的第一个字符。

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

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

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

while (*(str++)) 
{
    count++;
}

与…相同

while (*str++)
{
    count++;
}
© www.soinside.com 2019 - 2024. All rights reserved.