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

C 当赋值看起来合适时,为什么指针赋值显示左值错误?,c,pointers,lvalue,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; } 这让我对指针的概念更加困惑。请帮助。在C中,++a不是l值 非正式地

我得到了一段代码,我们必须猜测它的输出

我的产量: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;
}
这让我对指针的概念更加困惑。请帮助。

在C中,
++a
不是l值

非正式地说,这意味着你不能把它放在作业的左边

这也意味着你不能增加它

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


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

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

,您不能将其赋值或递增

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

就这些


<>(在C++中,这是一个左值,你可以同时做这两件事)。有趣的是,我们在结尾都写了关于C++的文章。@芭丝谢芭无论如何<代码> *((++u)++);
看起来像一个要避免的表达式,除非这是一个学习练习。@Bathsheba是的,应该避免。但这是一个学习练习,如果不对此进行评价,那将是不礼貌的。有趣的是,我们在结尾时都写了关于C++的文章。“我得到了一个代码,我们必须猜测它的输出。”在什么情况下?你确定你应该写C吗?你面临的问题与指针没有任何关系。它们仅与预增量运算符相关。你不必担心你对指针的了解。@LightnessRacesinOrbit是的,我应该用C写,这个问题来自atest@Gerhardh谢谢你具体说明
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;