为什么在C/C++中的while循环中只发生一次取消引用
Why does dereferencing occur only once in this while loop in 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 %dn",getLen(s));
}
输出:159
它被取消引用159次,而不仅仅是一次。
a
的ASCII值为97
。如果将159
增加3倍,则得到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
只被取消引用一次,而是在循环中每次都被取消引用,但它从未增加,因此每次取消引用的内存都是相同的。
相关文章:
- C++取消引用指针.为什么会发生变化
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 取消引用运算符不能重载
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++ 关于指针取消引用的技术问题
- 没有取消引用/解包对象的标准方法?
- 列表 iter 不取消引用 使用列表进行插入排序
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 取消引用结束指针到数组类型的一个
- 取消引用向量时出现问题
- 取消引用指向整数的指针时获得不同的结果
- C++:取消引用十六进制值,有点语法问题
- C/C++ 取消引用错误:在空检查之前取消引用
- 取消引用后C++空测试
- 立即取消引用unique_ptr
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 取消引用 void 指针以将值分配给结构
- boost_multi_index迭代器取消引用给出常量
- 为什么"std::uninitialized_copy"通常取消对未初始化内存的迭代器的引用不是未定
- 矢量迭代器不能与 std::shared_ptr<> 取消引用