• 左值的理解(给渴望学习的新手)


     今天运行了一段程序:

     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


    作者:leisure
    原文出自:http://www.cnblogs.com/leisure/
    感谢园子,感谢各位支持。本文版权归伟征和博客园共有,欢迎转载@ 但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    只是想分享,欢迎拍砖!促进我成长

  • 相关阅读:
    cf581B Luxurious Houses
    cf581A Vasya the Hipster
    2015.9.11模拟赛 codevs4162 bzoj1774【无双大王】
    2015.9.11模拟赛 codevs 4160【会玩的】
    2015.9.11模拟赛 codevs 4159【hzwer的迷の数列】
    bzoj2019 [Usaco2009 Nov]找工作
    贪吃蛇!!!
    bzoj3850 ZCC Loves Codefires
    cf509E Pretty Song
    cf509C Sums of Digits
  • 原文地址:https://www.cnblogs.com/leisure/p/2278382.html
Copyright © 2020-2023  润新知