| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 592 人关注过本帖
标题:赋值语句,用“=”,提示non-lvalue in assiment,为什么?谁能帮忙看看?谢 ...
只看楼主 加入收藏
计算机之祖
Rank: 2
等 级:论坛游民
帖 子:63
专家分:17
注 册:2015-9-1
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:5 
赋值语句,用“=”,提示non-lvalue in assiment,为什么?谁能帮忙看看?谢谢!
#include<stdio.h>
#include<stdlib.h>

int f(int n)
{
    if (n==1)
    f(n)=1;
    else
    f(n)=n*f(n-1);
}

int main()
{
   int a=5;
   printf("%d\n",f(a));
   
   system("pause");
   return 0;
}
2015-09-01 22:05
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你定义的函数f(n)不是一个可以储存数据的变量。

授人以渔,不授人以鱼。
2015-09-01 22:10
计算机之祖
Rank: 2
等 级:论坛游民
帖 子:63
专家分:17
注 册:2015-9-1
收藏
得分:0 
回复 2楼 TonyDeng
是不是:
我定义的int f(n)函数只是提供了一种递归的计算方式
并没有返回值

所以f(n)=f(n-1)*n 计算的时候,f(n-1)的值并没有被获取到
所以编译器误认为这是个等式

是么?
2015-09-01 22:22
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:1 
程序代码:
int f(int n)
{
   return n>1?n*f(n-1):1;
}

剑栈风樯各苦辛,别时冰雪到时春
2015-09-01 22:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:4 
以下是引用计算机之祖在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++编译器。

授人以渔,不授人以鱼。
2015-09-02 03:26
计算机之祖
Rank: 2
等 级:论坛游民
帖 子:63
专家分:17
注 册:2015-9-1
收藏
得分:0 
回复 5楼 TonyDeng
意思是,在C中
只有定义的float\int\double等类型的变量才会分配有固定的地址空间
而函数f(n),是个临时变量,地址随时变动,所以不能作为左值
而作为右值,比如类似int a=f(b)的形式,是可以将临时变量f(b)正确赋值给a的
是吧
你写的好详细,很耐心,领教了!!
真的非常感谢!!
2015-09-02 11:57
快速回复:赋值语句,用“=”,提示non-lvalue in assiment,为什么?谁能帮忙看 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018599 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved