首页 > 解决方案 > 带有递增和递减运算符的指针

问题描述

通常,当赋值运算符存在时,左操作数应该是变量而不是表达式,但是当我使用指针使左侧成为表达式时,代码不会产生任何错误。

Jdoodle 在线编译器/C

它应该抛出一个错误,但是成功的编译在那里。

https://www.jdoodle.com/c-online-compiler

#include <stdio.h>

int main()
{
    int x = 30, *y, *z;

    y = &x; // Assume address of x is 1000 and integer is 4 byte size */
    z = y;
    *y++ = *z++;
    x++;
    return 0;
}

标签: c

解决方案


赋值的左操作数不必是变量。例如,以下作业应该并且确实可以很好地工作(我假设您知道这一点并且只是误会了):

array[index] = value;
*ptr = value;

我认为让您感到困惑的*y++ = *z++;是您认为它分配给增量操作的结果,这确实没有意义。但这不是该表达式的优先级:*y++等效于*(y++), not (*y)++。因此,您要取消引用的结果,y++然后为该取消引用的内存位置分配一个值,就像您编写的那样:

int *ptr = y++;
*ptr = *z++;

推荐阅读