左值在C中返回指针

Dee*_*epu 2 c

我试着执行以下代码,

int val=10;
printf("%d",++val++);
Run Code Online (Sandbox Code Playgroud)

正如所料,我收到以下错误消息," lvalue required as increment operand".但是,当我做出以下更改时,程序运行正常.

int val=10;
int *ptr=&val;
printf("%d",++*ptr++);
Run Code Online (Sandbox Code Playgroud)

该计划的产出为11.输出值并不令人惊讶.

但整个构造++*ptr++是一个lvalue而不是一个rvalue混乱.

我打印了ptr之前和之后的内容如下,

printf("%u\n",ptr);
printf("%d",++*ptr++);
printf("\n%d\n",ptr);
Run Code Online (Sandbox Code Playgroud)

22935322293536是在屏幕上打印的地址.所以显然ptr已经增加并且涉及指针添加.

输出有意义除了这样的事实*ptr检索其地址被存储在可变的含量ptr10++*ptr它递增到11.这绝对是一个rvalue.但是后期增量(++)已经被ptr我相信了.为什么这样?在C中管理此类绑定的规则是什么?

Zby*_*000 6

您的观察是正确的,即前缀++应用于指针指向(int)的值,而后缀++应用于指针本身.

这是由于事实,即后缀++操作具有更高的优先级*,因此优先.因此,首先ptr递增并返回其原始值,然后取消引用此指针,并将其指向的int值递增并由表达式返回.++之后*由于其在代码中的顺序和依赖性而应用前缀,并且它们具有相同的优先级.

PS:打印指针的正确格式化程序是"%p".