繁体   English   中英

为什么取消引用在 C/C++ 的这个 while 循环中只发生一次? [等候接听]

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM