zoukankan      html  css  js  c++  java
  • 左值的理解(给渴望学习的新手)

    今天运行了一段程序:

    复制代码
     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

  • 相关阅读:
    MySQL事务的介绍+事务的特性+事务的开启
    MySQL误操作删除后,怎么恢复数据?
    笔记本如何开启WiFi热点?
    zabbix: Get value from agent failed: cannot connect to [[172.16.179.10]:10050]: [4] Interrupted system call
    考取RHCE认证的历程,总结的经验
    find的-xdev参数解释?
    keepalived+mysql主从环境,keepalived返回值是RST,需求解决方法?
    Centos 7 LVM xfs文件系统修复
    本文讲述下windows下使用rsync备份数据
    MySQL索引介绍+索引的存储类型+索引的优点和缺点+索引的分类+删除索引
  • 原文地址:https://www.cnblogs.com/zhwl/p/2758820.html
Copyright © 2011-2022 走看看