以下是引用计算机之祖在2015-9-1 22:22:42的发言:
是不是:
我定义的int f(n)函数只是提供了一种递归的计算方式
并没有返回值
所以f(n)=f(n-1)*n 计算的时候,f(n-1)的值并没有被获取到
所以编译器误认为这是个等式
是么?
赋值语句,=号左边必须是一个可以储存数据的变量,比如int x中的x,这就是提示信息中单词lvalue的意思,l是left,value是值,lvalue合起来叫“左值”。non-lvalue,就是非左值,一个不是左值的位置,是不可以赋值给它的,因为没有稳定的存储空间。函数f(n),是一段执行代码的入口地址,不是储存数据的,若在此地址存入数据,等于毁坏函数;同样,函数f(n)的返回值,在C语言中,它是一个临时变量,可以把这个临时变量的值赋给别的变量,但无法把别的数据赋值给这个临时变量,因为函数执行完毕,在临时变量位置写入返回值之后,随后的代码就把这个位置改作别的用途了(那是在栈上的一个临时数据),这就是前面提到它不是稳定存储空间的意思。不管f(n)是不是递归函数,都不可以这样赋值——但在C++中有例外,当f(n)返回一个引用的时候,可以这样写,那时候,f(n)是左值;C语言没有这种机制,所以我2楼的回答是刻意回避最简单的答案“函数不可以被赋值”,事实上,编译器的反馈信息也不是这样说,很显然,那是一个C++编译器。