为啥当分配看起来合适时指针分配显示左值错误?

Posted

技术标签:

【中文标题】为啥当分配看起来合适时指针分配显示左值错误?【英文标题】:Why Pointer assignment shows lvalue error when assignments look appropriate?为什么当分配看起来合适时指针分配显示左值错误? 【发布时间】:2019-04-15 14:03:54 【问题描述】:

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

我的输出: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;

这让我对指针的概念更加困惑。请帮忙。

【问题讨论】:

“我得到了一段代码,我们必须猜测它的输出。” 由谁提供?在什么情况下?你确定你应该写 C 吗? 您面临的问题与指针没有任何关系。它们仅与预增量运算符有关。您无需担心您对指针的了解。 @LightnessRacesinOrbit 是的,我应该用 C 语言编写,这个问题来自测试 @Gerhardh 感谢您指定 【参考方案1】:

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

In C, pre-increment results in an rvalue expression,您不得分配或递增。

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

仅此而已。

(在 C++ 中,它是一个左值,你可以同时做这两件事。)

【讨论】:

不赞成这个是不礼貌的。有趣的是,我们都在最后写了一些关于 C++ 的内容。 @Bathsheba 不管怎样*((++u)++); 看起来像是要避免的表达,除非这是一些学习练习.. @Bathsheba 是的,应该避免。但这是一个学习练习。【参考方案2】:

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

通俗地说,这意味着您不能将它放在作业的左侧。

这也意味着你不能增加它。

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

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

【讨论】:

不赞成这个是不礼貌的。有趣的是,我们都在最后写了一些关于 C++ 的内容。

以上是关于为啥当分配看起来合适时指针分配显示左值错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在将 malloc() 的指针分配给 char* 时会出现段错误?

为啥我的字符串分配会导致分段错误?

带指针的内存分配失败

未分配对象指针的 iOS Objec-C 错误

我为存储在指针地址中的值分配了一个变量,那么为啥当初始值改变时它不改变呢?

将一个指针分配给另一个时的段错误