Ilw*_*hoi 5 c rvalue lvalue pre-increment
我一直试图通过编写简单的代码来理解指针的概念,但遇到了一个错误问题,似乎我无法解决或理解它。
#include <stdio.h>
int *foo(void);
int main(void) {
printf("%d\n", *foo());
return 0;
}
int *foo(void) {
static int num = 1;
++num;
return &(++num);
}
Run Code Online (Sandbox Code Playgroud)
这是错误消息。
error: lvalue required as unary ‘&’ operand
return &(++num);
Run Code Online (Sandbox Code Playgroud)
函数'foo()'返回一个指向int的指针,并且main应该使用*运算符来打印返回的int。对于foo()中的静态num,我认为通过放置静态限定符,num不再是临时变量,因此'&'可用于num。
C和C ++相对于前缀增量运算符有所不同++。
在C中,结果是递增后的操作数的新值。因此,在此表达式&(++num) 中,试图获取临时对象(rvalue)的地址。
在C ++中,程序将是正确的,因为在C ++中,结果是更新的操作数。它是一个左值。
那就是在C中结果是一个新值,而在C ++中结果是更新的操作数。
因此,在C中,您可能不会例如编写
++++++x;
Run Code Online (Sandbox Code Playgroud)
而在C ++中,此表达式
++++++x;
Run Code Online (Sandbox Code Playgroud)
是正确的,您可以将一元运算符&应用于类似
&++++++x;
Run Code Online (Sandbox Code Playgroud)
为了使函数在C中正确无误,您必须将应用的运算符分开,例如
int *foo(void) {
static int num = 1;
++num;
//return &(++num);
++num;
return #
}
Run Code Online (Sandbox Code Playgroud)