大家帮忙,左值和右值的区别
飞天翼剑大牛的文章,写的,以下是链接
http://blog.csdn.net/supermegaboy/article/details/4855027
以下代码是该文章的部分
- C/C++ code
#include <stdio.h> struct Test{ int a[10];}; struct Test fun( struct Test* ); int main( void ){ struct Test T; int *p = fun( &T ).a; /* A */ int (*q)[10] = &fun( &T ).a; /* B */ printf( "%d", sizeof( fun( &T ).a ) ); /* C*/ return 0;} struct Test fun( struct Test *T ){ return *T;} 作者提到: 在这个例子里,fun( &T )的返回值是一个右值,fun( &T ).a就是一个右值数组,是一个右值表达式,但a本身是一个左值表达式,要注意这个区别。
作者提到 右值数组和左值表达式的问题。 实在不懂作者的意思,
为了搞清楚左值和右值的区别,于是写了以下代码:
以下代码是看了
- C/C++ code
#include <stdio.h>struct Test{ int a[10];};struct Test fun( struct Test* );int main( void ){ struct Test T; fun(&T).a[0]=1; printf("%d",fun(&T).a[0]); system("pause"); return 0;}struct Test fun( struct Test *T ){ return *T;}这个代码打印的结果是垃圾值, fun(&T).a[0]=1, 值没有赋值成功。
问题1: 函数的返回值算左值还是右值?
问题2. fun(&T).a[0]=1, 值没有赋值成功。 什么原因?
问题3: 数组分左 ,右, 什么意思?
[解决办法]
fun(&T)返回的是个临时的,因此赋值没用,下次执行fun(&T)又返回另一个临时对象
说Test::a是左值,你看fun(&T).a=0是否行得通
[解决办法]
左值在运算符左边,右值在运算符右边。
KK
[解决办法]
&是获得地址,只有变量才可能有地址啊
*和& *的操作数是右值,结果是左值——用地址换变量。&的操作数是左值,结果是右值——用变量换地址
[解决办法]
又是一个一头栽在没有实际意义的左右值概念里的兄弟啊。
[解决办法]
别问这些
变量可能在寄存器中,但内存中也预留了空间