【问题标题】:Incrementing an array resuit in lvalue required?需要在左值中增加数组结果吗?
【发布时间】:2014-11-18 16:37:27
【问题描述】:

增加一个数组导致需要左值?我的代码在下面请帮助我理解

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

【问题讨论】:

  • a=a+1// its good ORLY ?
  • 因为没有分号,没有单独报错?还是只有a+1

标签: c arrays post-increment


【解决方案1】:

int *rmv[];

clrscr();

printf("输入10个值");

for(int arnicsc=1;arnicsc

{

scanf("%d",&rmv[arnicsc]);

}

for(int arnicsc=1;arnicsc

{

printf("数组%d的值=[%d]",arnicsc,++rmv[arnicsc]);

}

【讨论】:

  • rmv 在你的例子中是一个数组未初始化的指针,所以这段代码会崩溃和烧毁。
【解决方案2】:

我将尝试解释数组不能是左值的原因,正如之前的答案所指出的那样。这在标准引入可变长度数组之前会更清楚,因为数组,而不是它们的元素,是常量,并且常量不能是超出赋值的左值。

没有循环的指针算法只对指向单个对象的指针有效。数组最好被视为指向一组对象的指针,这就是为什么数组的元素必须是相同类型的原因。

数组和指针一样,只是对内存中对象的引用。因此,当您索引数组元素以使用其值时,请将其视为指向您正在引用的对象,这就是 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,这就是您的问题所在。如果一个数组只是对一组相同类型对象的引用,那么如何在没有循环的情况下对整个数组执行任何形式的指针运算?这意味着该数组现在正在引用该数组之后的内存中的一组对象。但是数组必须引用一组与前一组对象相同类型的对象。你知道为什么这是“非法的”或不可能或不允许的吗?如果您对a = a + 1 执行测试,您可能会发现那行代码被您的编译器隐藏在地毯下OR a[0] 现在指向 a[1] 所指向的内容。如果您编写使用这种算法的其他程序,我会对测试结果感兴趣。通过执行这样的算术,您最终可能会访问您不应该访问的内存,这会导致...

最后,我们都需要记住的一个非常重要的概念是x = x + 1 x++ 用于这些指令有效的整个集合。 x++ 并不意味着总是加 1。它意味着“以有意义的方式提升价值”,如 http://www.embedded.com/design/programming-languages-and-tools/4410601/Pre-increment-or-post-increment-in-C-C-。在这种情况下,有意义的方法可能是在数组之后立即前进到内存地址,而不是将数组位置前进 1。

【讨论】:

    【解决方案3】:

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

    C11:6.3.2.1:

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

    的左值

    注意:

    • 可修改的左值是可寻址的(可以是一元 & 的操作数)和可赋值的(可以是 = 的左操作数)。
    • 不可修改的左值是可寻址的,但不可赋值。

    【讨论】:

    • 但是 a=a+1 是如何工作的,请您解释一下数组名称是不可修改的左值。我无法理解,请您解释一下
    • @carrercarrer;见编辑。 a = a+1 不能 100% 保证工作!
    • @hacks:错了。那是在 C 开始之前,然后停在那里。
    【解决方案4】:
        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]++;
    }
    

    【讨论】:

    • 对于 a=a+1 它的工作正常,我遵守并看到了它,但只有 a++ 需要左值?
    • @carrercarrer a = a + 1 不好,你可能使用了不同的测试用例。
    • 对不起 a=a+1 我只是将地址增加 4 个字节并且它可以工作但不是 a++?
    • @carrercarrer: a+1 可以,但a=anything; 不行,如这条评论所示:stackoverflow.com/questions/26012596/…
    猜你喜欢
    • 2012-11-19
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2013-01-27
    • 2011-09-07
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多