首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

*pc++=*pa++;等效于*pc=*pa;pc++;pa++; 吗?该怎么解决

2012-03-15 
*pc++*pa++等效于*pc*papc++pa++ 吗?在看一个程序时不明白 *pc++*pa++的作用,有位大侠指点等效于

*pc++=*pa++;等效于*pc=*pa;pc++;pa++; 吗?
在看一个程序时不明白 *pc++=*pa++;的作用,有位大侠指点等效于 *pc=*pa;pc++;pa++;,我想应该是这样,为了试验,我写了一个小程序,发现小程序执行出错,请各位高手给指点、解惑。


出错提示为:“Lvalue required in function main ”
出错位置标在下面程序中。
请各位大侠多多指点,看看都错在什么地方。

void main()
{
int pc,pa,i;
pc=pa=i=1;
while( pc<=20 )
{
/* pc=pa;pc++;pa++; 这句能编译通过*/
/* pc++=pa++; 这句提示出错,出错提示为:“Lvalue required in function main ”*/ 
printf("pc= ",pc," pa= ",pa,"No. :" ,i++,"\n");
}

以上程序在TC2.0下编译出错

当初不明白*pc++=*pa++; 的源程序如下,此程序来自《数据结构(C语言版)》,作者 严蔚敏:
void MergeList_Sq( SqList La, SqList Lb ,SqList &Lc )
{
//已知顺序线性表La和Lb的元素按值非递减排列
//归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列
pa=La.elem;
pb=Lb.elem;
Lc.listsize=Lc.length=( ElemType*)malloc( Lc.Listsize *sizeof(ElemType) );
if(!Lc.elem)exit(OVERFLOW);//存储分配失败
pa_last=La.elem+La.length-1;
pb_last=Lb.elem+Lb.length-1;
while(pa<=pa_last && pb<=pb_last)
{
//归并
if(*pa<=*pb)*pc++=*pa++;
else *pc++=*pb++; 
}
while(pa<=pa_last)*pc++=*pa++;
while(pb<=pb_last)*pc++=*pb++;
}//MergeList_Sq


[解决办法]
赋值表达式左边不能为表达式只能为变量!
[解决办法]

探讨

赋值表达式左边不能为表达式只能为变量!

[解决办法]
(1) *pc++=*pa++; <<==>> *pc=*pa;pc++;pa++;//这个等价式正确是因为 对指针解引用 得到的是一个左值(具有存储空间的)
(2)但是LZ的程序中,pc是一个整型变量,而不是指针。故pc++得到的是一个数值,不具有存储空间,故不可以对其赋值。


(2)左值和右值得概念
说左值是代表一个内存地址值,通过这个内存地址,就可以对内存进行读写操作;这也就是为什么左值可以被赋值的原因了。
相对应的还有右值:当一个符号或者常量放在操作符右边的时候,计算机就读取他们的“右值”,也就是其代表的真实值。
比如: int ia,ib;
ib=0;
ia=ib;
在这里,首先定义ia,ib。然后对ib赋值,此时计算机取ib的左值,也就是这个符号代表的内存位置即内存地址值,计算机取0的右值,也就是数值0;然后给ia赋值为ib,此时取ib的右值给ia的左值;
所以说,ib的左值、右值是根据他的位置来说的;
 

热点排行