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

时间:2020-01-24 19:47:03

标签: c++ visual-c++ while-loop pointer-arithmetic

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

请忽略指向文本常量,在newwer编译器上可能出现的警告或错误的部分,

我的问题是为什么它会输出'0'以及while循环如何工作,尝试同时使用调试器和printf。我对问题的理解是这样的:

  1. 将ptr移至“ e”

  2. 检查ptr的内容是“ e”,它不是0,所以它进入while循环

  3. 返回条件行,将ptr移至“ l”
  4. 检查* ptr,它不为0,输入... 等等等等字母l,o

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

我查看了另外两个主题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);
}

2 个答案:

答案 0 :(得分:2)

在循环内部,您没有使用在$xml_hash = { 'images' => [ { 'image' => [ { 'uri150' => '', 'type' => 'primary', 'uri' => '', 'height' => '511', 'width' => '600' }, { 'type' => 'secondary', 'uri150' => '', 'uri' => '', 'height' => '519', 'width' => '600' }, { 'uri' => '', 'height' => '521', 'width' => '600', 'type' => 'secondary', 'uri150' => '' }, etc... 条件下测试过的相同字符。

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

o

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

在处理完指针后,应增加指针。您可以通过将least移动到循环主体的末尾来实现。或者,您可以使用ptr++循环而不是for

while

答案 1 :(得分:0)

最后一个printf调用将字符串文字的结尾零输出为整数。

为清楚起见,请考虑一个带有一个实际字符的字符串文字,例如"A"

while循环的第一次迭代之前

while (*ptr++)
{
    printf("%c-", *ptr);
    least = ((*ptr) < (least)) ? (*ptr) : (least);
}

指针ptr指向字符串文字的字符“ A”。这个表情

*ptr++

可以想象像

char c = *ptr;
++ptr;

因此,由于“ A”不等于零,因此控制传递至循环的主体。同时,在评估条件之后指针ptr增大。因此,现在它指向字符串文字的终止零“ \ 0”。

由于0小于123,因此变量的最小值最小为0。

    least = ((*ptr) < (least)) ? (*ptr) : (least);

在循环的下一次迭代中,ptr仍指向终止的零。因此,控件绕过了循环的主体,在循环之后的下一条语句中输出了零。

根据C标准(6.5.2.4 Postfix递增和递减运算符)

2 postfix ++运算符的结果是 操作数。副作用是,操作数对象的值为 递增(即,将适当类型的值1添加到 它)。