以下程序的输出结果如何:

时间:2016-06-13 16:25:34

标签: c

  #include<stdio.h>
main()
{
    int val=1234;
    int* ptr=&val;
    printf("%d %d",val,*ptr++);
}



out of my knowledge i would manually get 1235 1234,

* ptr ++将输出1234作为输出,并且在该val变量打印1235之后将1235作为内存。 后来我意识到我对此的看法是错误的,在意思之后it.plz纠正我错误的地方,它显示输出为1234 1234

3 个答案:

答案 0 :(得分:1)

所以基本上,输出是1234 1234,因为:

  • ++的优先级高于*,postifx ++应用于指针,而不是指向
  • 的值
  • ptr将会增加,但是会再次增加:postfix,因此printf会收到当前值ptr指向(*ptr),这与val相同
  • ptr++是一项有风险的业务。正如@EOF指出的那样,指向“一个超过数组中的最后一个元素”甚至有效对象+ 1会产生有效指针。确实如此,但AFAIk,取消引用该指针至少是未指明的行为,我认为UB甚至存在风险。

简单地说,你的printf("%d %d\n", val, *ptr++)陈述等同于写作:

printf("%d %d\n", val, *ptr);
++ptr;//shift pointer to &val + 1

现在这不会导致任何问题。这取决于您在递增后对ptr执行的操作。您可以将指针移动到指向对象的1个位置,该内存将被视为包含随机值的同一时间值。
根据我收集的内容,C99标准没有指定WRT取消引用此指针的任何行为。最佳情况:它将产生垃圾值。可能它会产生未定义的行为,具体取决于指针的类型,值是陷阱表示。

大多数类型都有陷阱表示,AFAIK除了unsigned char之外都有。陷阱表示定义如下(C99 6.2.6类型表示)

  

某些对象表示不需要表示的值   对象类型。如果对象的存储值具有这样的值   表示,并由没有的左值表达式读取   字符类型,行为未定义。如果这样的表示   由副作用产生,修改全部或任何部分   通过没有字符类型的左值表达式对象   行为未定义。[41]这种表示称为陷阱   表示。

脚注

  

[41]因此,可以将自动变量初始化为陷阱   表示没有导致未定义的行为,但值   在存储适当的值之前,不能使用变量   它

因为持有陷阱表示的变量不是问题,指针指向O + 1是完全正常的,但使用该值是另一回事。

正如EOF再次指出的那样,C11标准更具体:无论是否存在风险WRT陷阱表示的类型,结果指针都无法安全解除引用: 如果结果指向一个超过最后一个元素对于数组对象,它不应该被用作被评估的一元*运算符的操作数 (在EOF的注释中引用)。

但回到你的问题:

因此,如果您想要输出1234 1235,最简单的方法是:

#include <stdio.h>

int main ( void )
{
    int i = 123, *p = &i;
    printf("%d %d\n", i, i+1);
    printf("%d %d\n", *p, *p + 1);//using pointers
    return 0;
}

由于缺少序列点,因此无法在一行中使用指针递增值并打印其旧值,然后打印新值。在将参数传递给函数之前有一个序列点,因此编写printf("%d %d\n", i, ++(*p));将打印1235 1235。

重要的是要了解没有特定的顺序来评估表达式。如果你试图做一些奇怪的事情:

int i = 8, *p = &i;
printf("%d %d %d\n", ++(*p), printf("%d", *p), ++(*p));

仍然无法可靠地预测输出。可能的输出是:

  • 810 1 10:首先评估内部printf调用,因此评估为8
  • 910 1 10:内部调用是要评估的第二个表达式(9)
  • 1010 2 10:最后评估内部呼叫(10)

答案 1 :(得分:0)

在解析表达式时,具有较高优先级的运算符将与其参数绑定得更紧密,类似于括号。

因此*ptr++被解析为*(ptr++)

由于后增量运算符,程序的输出为1234 1234。因此返回初始值1234

答案 2 :(得分:-1)

您不得混淆(*ptr)++*ptr++。这些计划将有不同的产出:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include<stdio.h>
main()
{
    int val=1234;
    int* ptr=&val;
    printf("%d %d",val,(*ptr)++);
}

输出

1235 1234

计划2

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include<stdio.h>
main()
{
    int val=1234;
    int* ptr=&val;
    printf("%d %d",val,*ptr++);
}

输出

1234 1234