需要增加左值的数组resuit吗?

时间:2014-09-24 08:54:41

标签: c arrays post-increment

增加数值结果需要左值?我的代码如下,请帮助我理解

 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 ? 
}

4 个答案:

答案 0 :(得分:3)

数组名称是不可修改的左值。你无法修改它。因此a = a + 1;a++;都是错误的。

C11:6.3.2.1:

  

可修改的左值是一个左值,没有数组类型,没有不完整的类型,[...]

注意:

  
      
  • 可修改的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]);

}