左值的理解(给渴望学习的新手)
今天运行了一段程序:
1 #include "stdafx.h"
2
3
4 int _tmain(int argc, _TCHAR* argv[])
5
6 {
7
8
9 return 0;
10 }
11 void f(int x,int y)
12 {
13
15 int *q=&(x++);
16
17
18 }
没有编译过去报错说:“&”要求左值!
开始学习:
1.关于++a和a++的故事
实际运算:
++a等价于 a=a+1而 a++等价于(t=a;a=a+1,t);
基本意思就是说所以t这个东西是个临时的东西放到哪了?我们来看一下汇编指令:
1 7: int x=0;
2 00401028 mov dword ptr [ebp-4],0
3 8: x++;
4 0040102F mov eax,dword ptr [ebp-4]
5 00401032 add eax,1
6 00401035 mov dword ptr [ebp-4],eax
原理在寄存器里面了! 我们我访问权限?不知道学了汇编告诉你!反正不能取地址了!
PS:汇编中交换指令:XCHAG 的寻址方式:
所以,交换指令中的a++ 中的 t就是在寄存器中,当然无地址可言了(2012年3月11日20:44:36)
2.关于左值的学习
自己的理解:左值的,顾名思义放在等号左边的值(偷笑),我现在这个理解估计适合初学者!&“取地址运算符”要求一个实实在在在内存里面的东西,自然t不是喽!所以不行!来看看大牛们怎么说的!
1./C++语言中可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量。或者说左值是代表一个内存地址值,并且通过这个内存地址,就可以对内存进行读并且写(主要是能写)操作
2.左值定义及应用
小结:
(1)定义和含义
a) 左值是指具有对象类型或非空不完整类型的表达式。(关键是要可以引用到对象,也就是要可以拥有可访问的存储,l-location)
b) 右值(rvalue)是指表达式的值。(在C里表达式的值一定是右值;在期待右值时,左值会自动转化为右值。r-read)
(2)依据下述规则来判断左值:
a) “通过非函数类型声明的非类型标识符”都是左值
b) 每种运算符都规定了它的运算结果是否左值。
(3)常见规则
a) 下列运算符的操作数要求左值:Sizeof运算符, 取地址运算符 & , ++ 运算符, -- 运算符,赋值 = 运算符的左侧,成员 . 运算符的左侧。
b) 间接运算符*的运算结果是左值;取地址运算符&的运算结果是右值。
c) 下列表达式不能产生lvalue: 数组名,函数,枚举常量,赋值表达式,强制类型转换(目标类型是引用时除外),函数调用。
引用:http://blog.csdn.net/slowgrace/archive/2009/10/20/4704066.aspx