左值错误和数组指针
Posted
技术标签:
【中文标题】左值错误和数组指针【英文标题】:Lvalue errors and array pointers 【发布时间】:2018-06-03 11:05:07 【问题描述】:代码是这样的
#include<stdio.h>
#include<stdlib.h>
int main()
int a[]=10,20,30,40,50;
int j;
for(j=0;j<5;j++)
printf("%d\n",*a);
a++;
return 0;
输出-
Error-:Lvalue 需要作为增量操作数
这里为什么会出现左值错误??
【问题讨论】:
因为a++
是不允许的,而且无论如何也没有意义,所以错误是正确的。我的水晶球告诉我有人在某处告诉你 C 中的数组和指针是同义词。如果是这样,他们就撒谎了。
但它与左值错误有什么关系
后增量最终会做什么?它将评估后的结果存储到a
,这和a = ...
一样非法
【参考方案1】:
++
的操作数必须是可修改的左值。
来自C11
,第 6.5.2.4 章
后缀自增或自减运算符的操作数应具有原子性、限定性、 或不合格的实数或指针类型,并且应为可修改的左值。
数组名,不是可修改的左值。因此,它不能作为++
的操作数。
添加,引用C11
,章节§6.3.2.1
[...] 可修改的左值是一个左值 没有数组类型,没有不完整的类型,没有 constqualified 类型,如果它是结构或联合,则没有任何成员(包括, 递归地,所有包含的聚合或联合的任何成员或元素)具有 constqualified 输入。
【讨论】:
关于右值的任何 cmets 先生 @Arpitking 很好,标准没有定义右值。但是,它可以被认为等同于表达式的值。 标准确实在脚注中提到:"What is sometimes called 'rvalue' is in this International Standard described as the 'value of an expression'." 我也听说过任何不是左值的值都是右值。 @DavidBowling 这就是我所说的不是“定义”的意思。我在之前的评论中也提到了相同的“表达式的值”。 @SouravGhosh -- 我只是在非规范性脚注中指出标准与您一致【参考方案2】:您不能增加数组的名称。您是否会执行以下操作,这会很好,因为您将使用指针:
int main()
int a[]=10,20,30,40,50;
int *b= a;
int j;
for(j=0;j<5;j++)
printf("%d\n",*b);
b++;
return 0;
【讨论】:
【参考方案3】:您可以使用在指针数组上添加索引值来显示数组值。
代码:
#include <stdio.h>
int main()
int a[]=10,20,30,40,50;
int j;
for(j=0;j<5;j++)
printf("%d\n",*(a+j));
return 0;
输出:
【讨论】:
以上是关于左值错误和数组指针的主要内容,如果未能解决你的问题,请参考以下文章