我了解Lvalue的一些内容,但我不明白下面的代码是如何产生错误的:
#include<stdio.h>
void foo(int *);
int main()
{
int i=10;
foo((&i)++);
}
void foo(int *p)
{
printf("%d",*p);
}
6:13:错误:需要左值作为增量操作数 FOO((&安培;ⅰ)++); ^
答案 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>