gpt4 book ai didi

c++ - 不明白为什么while(* ptr++)输入while循环以获取0值(字符串终止符)

转载 作者:行者123 更新时间:2023-12-02 10:06:41 26 4
gpt4 key购买 nike

我对下面的一些琐碎的示例代码有疑问:
(在Visual Studio 2015中)

请忽略指向文本常量,newwer编译器上可能出现的警告或错误的部分,这不是我不理解的地方。

我的问题是,为什么使用调试器和printf都输出“0”以及while循环如何工作。我对问题的理解是:

  • 移动ptr指向“e”
  • 检查ptr的内容是'e'而不是0,因此它会在while循环中进入
  • 返回条件行,将ptr移至'l'
  • 检查* ptr,它不为0,输入...
    等等等等字母l,o

  • 然后它在'o'之后增加ptr并得到'\ 0',根据我的逻辑,这时它不应该进入循环,但是我这样做了,并且当它指向终结子指向垃圾时不再经过一个步骤? !

    我查看了另外2个主题 this topic about operator precedencethis one about the while(*ptr) case going over the terminator,但是从第二个原因我不明白为什么它会进入循环,然后再增加指针值呢?对于我理解的顺序是先增加指针,然后用*获得值
    #include <cstdio>
    #include<stdlib.h>

    int main(void) {
    char* str = "hello";
    char* ptr = str;
    char least = 127;
    while (*ptr++) {
    printf("%c-", *ptr);
    least = ((*ptr) < (least)) ? (*ptr) : (least);
    }
    printf("%d\n", least);
    }

    最佳答案

    在循环内部,您没有使用在while条件下测试的相同字符。

    由于ptr++是后递增的,因此它将返回ptr的当前值,然后对其进行递增。因此,当ptr指向o字符时,

    while (*ptr++)

    它测试 'o'(不为零),因此它将进入循环。但是在测试之后,它会增加 ptr指向下一个字符,因此现在它指向 '\0'。然后,它将打印此字符并为其设置 least

    您应该在处理指针后增加它。您可以通过将 ptr++移动到循环主体的末尾来实现。或者,您可以使用 for循环代替 while:
    for (ptr = str; *ptr; ptr++)

    关于c++ - 不明白为什么while(* ptr++)输入while循环以获取0值(字符串终止符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59902822/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com