*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的左值、右值是根据他的位置来说的;