编译此代码时,
#include <stdio.h>
int *foo();
int main()
{
*foo()++;
return 0;
}
int *foo()
{
static int bar;
return &bar;
}
Clang向我显示错误:
static2.c:7:8: error: expression is not assignable
为什么这是非法的?我认为bar
具有静态存储持续时间,因此其生命周期整个程序执行。虽然bar
本身对main()
不可见,但指针应该能够修改它。
这个版本的foo()
也不起作用,而且Clang给了我同样的错误:
int *foo()
{
static int bar;
static int* ptr = &bar;
return ptr;
}
答案 0 :(得分:6)
由于运算符优先级(后缀增量++
)高于取消引用,*
)(请参阅http://en.cppreference.com/w/cpp/language/operator_precedence),
*foo()++;
相当于:
*(foo()++);
这是无效的,因为foo
的返回值是指针而foo()
计算为临时指针。您不能递增或递减临时指针。
您可以使用以下方法修复它:
(*foo())++;
答案 1 :(得分:2)
由于您使用返回值的方式,它是非法的。 bar
可见,可在main()
问题在于
*foo()++;
您需要在括号中提供表达式
(*(foo()))++;