为什么在这种情况下输出为“0”? #包括 内部主(空) { int i; int*p=(int*)malloc(5*sizeof(int)); 对于(i=0;i

为什么在这种情况下输出为“0”? #包括 内部主(空) { int i; int*p=(int*)malloc(5*sizeof(int)); 对于(i=0;i,c,post-increment,C,Post Increment,#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; } 是否有下列情况: printf("%d ", *++ptr); 取消引用ptr,得到ptr[0] 打印出步骤1

#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;
}
是否有下列情况:

printf("%d ", *++ptr);
  • 取消引用
    ptr
    ,得到
    ptr[0]
  • 打印出步骤1计算结果为的
    int
    ,即
    ptr[0]
  • 增量
    ptr
    因此它指向
    ptr[1]
  • 要打印出
    ptr[1]
    请使用:

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

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

    表达式
    *ptr++

  • *ptr
  • *ptr
    的值用作
    printf(“%d”,*ptr);
  • ptr=ptr+1
  • 这些表达式的输出可以通过以下方式理解:

  • 前缀+++
    *
    的优先级相同。两者的关联性是从右向左
  • 后缀++的优先级高于
    *
    前缀+++后缀+++的关联性是从左到右
  • 因此,在上面的代码中,指针不应该先递增,然后取消引用,因此输出应该是1吗

    对于此要求,请使用以下内容:

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

    您的优先部分是对的,但是让我们看看后缀增量运算符属性,好吗

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

    后缀
    ++
    运算符的结果是操作数的值。
    作为一种副作用,操作数对象的值会递增(即,将适当类型的值1添加到它)。[…]


    因此,变量本身将经历增量的影响,但变量所在的语句(带有后缀增量)将使用变量的现有值,而不是增量值。增量将在后面的部分作为副作用执行。

    首先,您应该添加
    #include
    。其次,您应该更正代码
    int*p=(int*)malloc(10*sizeof(int));
    。那么
    *p++
    代表
    1.printf*p;2.p++
    。如果你想得到值1,你应该使用code
    printf(“%d”,*+++p”);
    。我希望这能对你有所帮助。

    请输入
    malloc()的返回值
    和家庭在
    C
    中。以上帖子中给出的答案主要是说我们必须编写不必要的代码,这与我的问题有什么关系?你需要
    #包括
    *p++
    是否会被视为
    *(p++)
    ?因为
    ++
    *
    具有相同的优先级,关联性将从右到左。@ameyCU:简而言之:没有。这里有很长的原因(来自C11Draft 6.5.2.4/2):“后缀++运算符的结果是操作数的值。作为一种副作用,操作数对象的值会增加(即,将适当类型的值1添加到其中)。有关约束、类型和转换以及操作对指针的影响的信息,请参阅加法运算符和复合赋值的讨论。在更新操作数存储值的副作用之前,对结果的值计算进行排序。”这里的关键词:“副作用”@ameyCU:你对结果的看法是对的,但实际上后缀运算符(包括增量)的优先级高于一元运算符(如解引用)。@alk是的。我知道了。谢谢你。