增加数值结果需要左值?我的代码如下,请帮助我理解
int main()
{
int a[]={10,20,30,40,50};
a=a+1 ;// i am increment an array address
a++ ;// but here its bad, here why lvalue required ?
}
答案 0 :(得分:3)
数组名称是不可修改的左值。你无法修改它。因此a = a + 1;
和a++;
都是错误的。
可修改的左值是一个左值,没有数组类型,没有不完整的类型,[...]
注意:
- 可修改的l值是可寻址的(可以是一元&的操作数)和assignable(可以是=的左操作数)。
- 不可修改的l值是可寻址的,但不可分配。
答案 1 :(得分:2)
a=a+1// its good
a++//its bad, here why lvalue required ?
实际上两者都不行,数组是C中的二等公民:无法在C中分配数组。
您可以做的是修改数组元素:
for (size_t i = 0; sizeof a / sizeof *a; i++)
{
a[i]++;
}
答案 2 :(得分:0)
我将尝试解释为什么数组不能像前面的答案所指出的左值。在标准引入可变长度数组之前,这一点会更清楚,因为数组而不是它们的元素是常量,而常量不能超出赋值的左值。
没有循环的指针算法仅对指向单个对象的指针有效。数组最好被视为指向一组对象的指针,因此数组元素必须属于同一类型的原因。
与指针一样,数组只是对内存中对象的引用。因此,当您索引数组元素以使用其值时,请将其视为指向您正在引用的对象,因此a[0]
< => *a
。但是使用星号表示法,相当于a[1]
?您必须声明,指定指向a + 1
的指针并取消引用指针。为了说明我的意思,我将使用一个字符串。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char** argv)
{
char* text = malloc(8);
unsigned short n;
printf("Enter a 7 character word: ");
scanf_s("%s", text);
do {
printf("Which character by 0-indexing would you like to print?: ");
scanf_s("%u", &n);
} while (n > strlen(text) - 1);
printf("Character %u is %c\n", n, text[n]);
free(text)
return 0;
}
现在,当您对指针或/和数组进行任何加法或减法时,您基本上所做的是通过引用从一个对象移动到下一个对象。请注意,通过指针和数组算术,我指的是这个问题所在的text = text + 1
。如果一个数组只是对同一类型的一组对象的引用,那么如何在没有循环的情况下对整个数组执行任何形式的指针运算?这意味着数组现在正在引用数组之后的内存中的一组对象。但是数组必须引用一组与前一组对象相同类型的对象。你是否意识到为什么这是非法的&#34;或不可能或不允许?如果你在a = a + 1
上执行测试,你可能会发现你的编译器在那个代码下滑了 OR a [0]现在指向[1]指向的内容。如果您编写其他使用此类算法的程序,我会对测试结果感兴趣。通过执行此类算法,您可能最终会访问您不应访问的内存,这会导致......
最后,我们都需要记住的一个非常重要概念是x = x + 1
&lt; = / =&gt; x++
表示这些指令有效的整个集合。 x++
并不意味着总是添加1.它意味着&#34;以有意义的方式提升价值&#34;如在http://www.embedded.com/design/programming-languages-and-tools/4410601/Pre-increment-or-post-increment-in-C-C-中那样。在这种情况下,有意义的方法可能是在数组之后立即前进到内存地址,而不是将数组位置提前1。
答案 3 :(得分:-1)
int * rmv [];
clrscr();
printf(“输入10个值”);
for(int arnicsc = 1; arnicsc&lt; = 10; arnicsc ++)
{
的scanf( “%d”,&安培; RMV [arnicsc]);
}
for(int arnicsc = 1; arnicsc&lt; = 10; arnicsc ++)
{
printf(“数组%d = [%d]的值”,arnicsc,++ rmv [arnicsc]);
}