#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
答案 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));
仍然无法可靠地预测输出。可能的输出是:
printf
调用,因此评估为8 答案 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