c - 为什么当分配看起来合适时指针分配显示左值错误?
问题描述
我得到了一段代码,我们必须猜测它的输出。
我的输出: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。
在 C 中,预增量会产生一个右值表达式,您可能不会对其进行赋值或增量。
这不是逻辑问题;这是一个语言问题。您应该将该复杂的公式拆分为多个代码语句。
这里的所有都是它的。
(在 C++ 中,它是一个左值,你可以做这两件事。)
推荐阅读
- javascript - 将 Javascript 导入 Angular 组件问题
- c - 内联中file-static out-of-line、global out-of-line和no out-of-line copy函数是什么意思
- python - Dataflow Sideinputs - SDK 2.x 中的工作器缓存大小
- c# - 初始 GET 比获取 TF.exe 需要更长的时间
- reactjs - 当我滚动时,我的状态发生了变化,但在 useEffect 时不添加类
- nlp - 如何将 sklearn-DBSCAN 结果的噪声数据与其他集群相关联?
- c# - C# 中用于多个属性的数据结构,无需创建类
- kubernetes - Kubernetes API Server watch 机制是如何工作的?
- ios - 将视图内容保持在键盘 Swift IOS 上方
- angular - 从管道更改语言时如何更改日期格式