2

以下是我想知道旁注中 2 个问题的答案的代码。请帮我

#include<iostream>

using namespace std;

int main()
{
    char *p="Hello";
    cout <<*p;     //gives H
    cout <<*(p++); //also gives H.Why?
    cout <<*(p++); //gives e.
    cout <<*(p++); //gives l.
    cout <<*(p++); //gives l.
    cout <<*(p++); //gives o.
    cout <<*(p++); //gives no output.Why? It should give some garbage value!
}
4

8 回答 8

4

*(p++)给出,'h'因为您首先询问该值,然后增加指针的位置,并且在最后一行中它是相同的。

于 2013-07-25T06:15:46.060 回答
4
  1. 如果您p++在代码中的任何地方使用,请说:

    <some code> p++ <some code>
    

    相当于

    <some code> p <some code>;
    p = p + 1;
    

    相反,如果你写:

    <some code> ++p <some code>
    

    相当于

    p = p + 1;
    <some code> p <some code>
    

    那应该回答你的第一个问题。

  2. C 风格的字符串自动以 \0 字符结尾。因此,如果您声明:

    char *p="Hello";
    

    编译器会自动为您添加一个 \0 到该字符串的末尾(否则像 printf 这样的函数在字符串完成时不会知道)。所以你的字符串实际上是:

    "Hello\0"
    

    但是,如果您尝试进一步推动指针,您最终会进入无效内存并且您可能会遇到任何问题(垃圾,也可能是一系列零)

于 2013-07-25T06:18:43.420 回答
3

p++实际请求值,然后增加它。如果你想增加它然后让值增加,使用++p.

对于您的最后一个问题,C 字符串的最后一个值始终是'\0'. 在大多数情况下,这不会在终端上打印任何内容,但这是 C++ 标准未定义的行为。

于 2013-07-25T06:18:04.060 回答
3

p++ 所做的是递增 p 并返回 p 的旧值,因此 *(p++) 将始终返回存储在 *p 中的字符,并且在语句之后 *p 将指向下一个字符。

cout <<*(p++); //gives 0.

这实际上并没有给出0,它给出了字符“o”,即 中的最后一个字符Hello

cout <<*(p++); //gives no output.Why? It should give some garbage value!

这将输出终止字符串的 NUL 字符'\0'。这是一个不可打印的字符,在您看到此输出的地方您看不到任何可能是因为软件决定不打印不可打印的字符。例如,如果您查看输出的十六进制转储,您可以在 o 之后看到 NUL:

00000000  48 48 65 6c 6c 6f 00                              |HHello.|

如果您再添加另一个cout <<*(p++),您可能会看到垃圾输出,或者程序可能会崩溃,或者可能会发生其他事情,因为这将是“未定义的行为”。

于 2013-07-25T06:23:16.300 回答
1

第一个*(p++)给出“H”,因为 ++ 运算符被定义为首先给出其当前值,然后执行增量。final*(p++)返回字符'\0',因为字符串字面"Hello"量指向一个由六个字符组成的数组,其中最后一个是'\0'

于 2013-07-25T06:19:27.313 回答
1

这是因为在使用后增量(例如 your )时,会在增量完成之前p++评估值。

因此,在您的代码中,您的 firstcout << *(p++);将打印 'H',因为它将在赋值p 之前评估 的值,即 的地址p,然后p增加 的值。

要在p评估之前增加 的值,请使用 pre-incremental ++p

所以这就是你的代码中会发生的事情:

int main()
{
    char *p="Hello";
    cout <<*p;     //gives H
    cout <<*(++p); //this time it will give e
    cout <<*(++p); //gives l.
    cout <<*(++p); //gives l.
    cout <<*(++p); //gives o.
    cout <<*(++p); //gives no output since the character after a string is always \0 (credit to answer below)
}

希望这可以帮助!=D

于 2013-07-25T06:22:38.743 回答
0

做这个:

{
    char *p="Hello";
    cout <<*p;     //gives H.
    cout <<*(++p); //gives e.
    cout <<*(++p); //gives l.
    cout <<*(++p); //gives l.
    cout <<*(++p); //gives o.
    cout <<*(++p); //gives 0.
    cout <<*(++p); //will either be a garbage value or throw an exception
}

++p 将增加指针,然后返回值。p++ 将值压入堆栈,递增指针,然后弹出堆栈以返回它。它也可能使用寄存器;实现细节取决于编译器。

于 2013-07-25T06:21:00.163 回答
0
char *p="Hello";
cout <<*p;     //gives H
cout <<*(p++); //also gives H.Why?

因为后增量将在p评估后增加。p要在评估之前递增,请使用*(++p)

cout <<*(p++); //gives e.
cout <<*(p++); //gives l.
cout <<*(p++); //gives l.
cout <<*(p++); //gives 0.
cout <<*(p++); //gives no output.Why? It should give some garbage value!

每个 C 风格的字符串都有一个填充\0

于 2013-07-25T06:22:48.963 回答