簡體   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