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