当指针看起来合适时,为什么指针分配会显示左值错误?

时间:2019-04-15 14:03:54

标签: c pointers lvalue

我得到了一段我们不得不猜测其输出的代码。

我的输出:60

#include <stdio.h>

int main()
{
    int d[] = {20,30,40,50,60};
    int *u,k;
    u = d;
    k = *((++u)++);
    k += k;
    (++u) += k;

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

    return 0;
}

预期: k = *((++u)++)等于30,因为它将迭代一次(++ u),然后将被迭代但未分配。所以我们在d [1]。

(++u) += k在这里,您将迭代到下一个位置,向其添加k,然后将结果分配给u的下一个元素。

实际结果:

main.c: In function ‘main’:
main.c:16:16: error: lvalue required as increment operand
     k = *((++u)++);
                ^
main.c:18:11: error: lvalue required as left operand of assignment
     (++u) += k;

这使我在指针的概念上更加困惑。请帮忙。

2 个答案:

答案 0 :(得分:8)

正如编译器告诉您的那样,该程序不是有效的C。

In C, pre-increment results in an rvalue expression,您不能分配给它或增加它。

这不是逻辑上的问题;这是语言问题。您应该将该复杂公式拆分为多个代码语句。

仅此而已。

(在C ++中,它是一个 lvalue ,您可以同时做这两个事情。)

答案 1 :(得分:6)

在C中,++a 不是 l值。

非正式地,这意味着您不能将其放在作业的左侧。

这也意味着您无法增加它。

所以(++a)++是无效代码。

(请注意,它是有效的C ++)。