为什么foo((& i)++)给出Lvalue所需的错误。没有关联的数组

时间:2017-11-11 02:06:32

标签: c reference lvalue

我了解Lvalue的一些内容,但我不明白下面的代码是如何产生错误的:

#include<stdio.h>

void foo(int *);

int main() 
{
   int i=10;
   foo((&i)++);
}

void foo(int *p)
{
    printf("%d",*p);
}

6:13:错误:需要左值作为增量操作数      FOO((&安培;ⅰ)++);              ^

2 个答案:

答案 0 :(得分:2)

x ++结果遵循步骤。

1) read the value of x in to register.
2) increment the value of x
3) write the incremented value back to x (which means you are changing the value of x by '1')

但你要做的是(&amp; i)++,这意味着以下几点。

1) read address of i into register
2) increment the address by 1
3) write the incremented value in to address again? How you can change the address?

如果要将存储在下一个地址中的整数发送到foo(),则需要增加如下。

int *p = &i + 1;
foo(p);

但这可能会导致未定义的行为,因为您只知道存储i值的i的地址。一旦递增地址,您将获得下一个地址,它可能包含一些垃圾值。

答案 1 :(得分:1)

尝试将一元运算符&应用于评估为表达式(&i)++的临时对象。您不能将运算符应用于临时对象。

C标准(6.5.3.2地址和间接操作符):

  

1 一元&amp;的操作数operator 应该是函数指示符,[]或一元*运算符的结果,或者是一个左值,它指定一个不是位字段的对象,并且不使用寄存器存储类说明符声明。 / p>