【问题标题】:Why is the output `0` in this case?为什么在这种情况下输出“0”?
【发布时间】:2015-07-28 09:52:22
【问题描述】:
#include <stdio.h>

int main(void)
{
    int i;
    int *p = (int *) malloc(5 * sizeof(int));

    for (i=0; i<10; i++)
        *(p + i) = i;

    printf("%d ", *p++);
    return 0;
}

所以,我运行了这段代码。现在我在这里被告知Why won't the output be 4 in this case?(在接受的答案中)*p++ 将首先增加指针然后取消引用它。因此,在上面的代码中,指针不应该先递增然后取消引用,因此输出应该是1吗?相反,输出结果为0。为什么?

【问题讨论】:

  • see why not to castmalloc()C中的family返回值。
  • 上述帖子中给出的答案大多是说我们必须编写不必要的代码,这与我的问题有什么关系?
  • 你需要#include &lt;stdlib.h&gt;

标签: c post-increment


【解决方案1】:

你说对了优先级部分,但是让我们看看后缀增量运算符属性,好吗?

C11 标准在第 §6.5.2.4 章中说,后缀递增和递减运算符

后缀++ 运算符的结果是操作数的值。 作为副作用,操作数对象的值递增(即相应类型的值 1被添加到它)。 [...]

因此,变量本身将体验增量的效果,但是存在变量(带有后缀增量)的语句将使用现有的变量的值,而不是增量值。增量将在后面作为副作用执行。

【讨论】:

    【解决方案2】:

    此声明

    printf("%d ", *ptr++);
    

    执行以下操作:

    1. 取消引用ptr,得到ptr[0]的值
    2. 打印出int 步骤1 的计算结果,即ptr[0]
    3. 增加ptr,使其指向ptr[1]

    要打印出ptr[1],请使用:

    printf("%d ", *++ptr);
    

    【讨论】:

    • 你不认为*p++ 会被视为*(p++) 吗?由于++* 具有相同的优先级,并且关联性将从右到左。
    • @ameyCU: 简而言之:No. Long reason here (from the C11Draft 6.5.2.4/2): "后缀 ++ 运算符的结果是操作数的值。如副作用,操作数对象的值递增(即,将相应类型的值 1 添加到它)。有关约束、类型和转换以及效果的信息,请参阅加法运算符和复合赋值的讨论对指针的操作。结果的值计算在更新操作数的存储值的副作用之前排序。“此处的关键字:“副作用
    • @ameyCU:你的结果是对的,但实际上后缀运算符(包括增量)比一元运算符(如取消引用)具有 更高 的优先级。
    • @alk 是的。我明白了。谢谢你。
    【解决方案3】:

    请注意,这是后期增量。因此,后缀++ 运算符的返回值就是操作数本身的值,然后作为副作用,操作数对象的值会递增。

    表达式*ptr++ 将是

    1. *ptr
    2. 使用*ptr的值作为printf("%d ", *ptr);
    3. ptr = ptr + 1

    此类表达式的输出可以理解为:

    1. prefix ++* 的优先级相同。两者的关联性是从右到左
    2. 后缀 ++ 的优先级高于 *前缀 ++后缀 ++ 的关联性是从左到右

    因此,在上面的代码中,指针不应该先递增然后取消引用,因此输出应该是1吗?

    针对此要求使用以下内容:

    printf("%d ", *++ptr);
    

    【讨论】:

      【解决方案4】:

      首先,您应该添加#include &lt;stdlib.h&gt;。其次,您应该更正您的代码int *p = (int *) malloc(10 * sizeof(int));。那么*p++ 代表1. printf *p; 2. p++。如果你想得到值 1,你应该使用代码printf("%d ", *++p);。我希望这可以帮助你。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-23
        相关资源
        最近更新 更多