zoukankan      html  css  js  c++  java
  • i++和++i以及左值,右值

    左值(LValue)和右值(RValue)的一个快捷记法是赋值运算,左值是赋值运算左边的值,右值就是右边(=,=废话)。例如:

    int a = 5;

    a就是左值,5就是右值。

    当然,如果真是这么个含义,那么这概念就相当蛋疼了。其实不是这样的~~

    左值其实是对一块内存区域的引用(这个还不是C++中的int &a之类的引用),比如上边的a,就对应了一块内存区域(起始地址为&a,大小为sizeof(int))。

    更专业的定义在这里:

    An object is a region of storage that can be examined and stored into. An lvalue is an expression that refers to such an object. An lvalue does not necessarily permit modification of the object it designates. For example, a const object is an lvalue that cannot be modified.

    lvalue不一定允许修改,如const int a,a也是一个左值,只不过在定义const类型必须初始化,为什么,如果不初始化,后面

    想要对其赋值:

    int a=5;

    由于a是const,不能赋值,所以必须在定义时初始化

    右值对应的玩意其实也在内存里,但是我们忽略这一点,认为它存在于冥冥之中。例如上边那个5,其实它在静态数据段或者程序二级制代码中,但我们不关心这个,认为它无法修改。

    附个链接:

    http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7a.doc%2Flanguage%2Fref%2Fclrc05lvalue.htm

    记住:

    ++i是左值,i++是右值。

    因为++i 返回 i 本身,而 i++ 返回 i 的值。

    int i=0;

    ++i=5;
    cout<<i<<endl; //5

    一篇文章:

    左值和右值的区别:

    1. 概念变量和文字常量都有存储区,并且有相关的类型,区别在于变量是可寻址的;

    对于每个变量,都有2个值与其相关联:

     1>数据值,存储在某个内存地址中,也称右值(rvalue),右值是被读取的值(read value),文字常量和变量都可被用于右值

     2>地址值,即存储数据值的那块内存地址,也称左值(lvalue),文字常量不能被用作左值。

    2 . 问题给表达式加上括号:

     ++a--

    结果 ++(a--)

    这个表达式是非法的,因为前增量操作要求一个可修改的左值,而 "a--" 不是左值(即右值

     3 . 前增量和后增量的区别

    早期的c语言教材,for循环语句通常写成:

    for(int i=0;i<10;i++)

    而现在多为:

    for(int i=0;i<10;++i) 两者有区别吗?

    a++ 即是返回 a的值,然后变量 a 加 1,返回需要产生一个临时变量类似于

    { int temp = a;

       a=a+1;

       return temp; //返回右值 }

    ++a 则为:

    { a=a+1;

       return &a; //返回左值 }

    显然,前增量不需要中间变量,效率更高

      int m=0;
           for(int i=1;i<=100;i++){
                  m=m++;
          }

    m=m++,可以这样理解,首先看后面,m在前,是先用再加,m一直在用,所以每次赋值都无效!!!所以一直还是原来的值,即0。 理论上应该为0,但是实际上输出::100.

    为什么:

    如果是c++的话,值为100,

    如果是java,为0.

    深入解释:

    http://www.oschina.net/question/12_8120

    总结的是C++和java 结果不一样.呵呵

    貌似所有C++编译器都是在整个;语句表达式结

    如果改成++m;

    值为100.

     int m=0;
      for(int i=1;i<=100;i++){
       m=i++;

    输出:99,为什么?

    当i=99时,m=99,然后i加1,为100,然后i++变成101,101超出100,退出。

    下一题:

    int m=0;
     for(int i=0;i<100;i++)
             m=i++;
         cout<<m<<endl;

    输出:98

    i=98的时候,执行自加,m=98。这个时候,在循环体里面的i已经达到99了,加完后再回到for表达式的自加,i变成100,进入判断i<100,不再执行循环,推出。 点评,这个,,,很容易搞错成100或者99

    int m=0;
     for(int i=0;i<100;i++)
            m=++i;
         cout<<m<<endl;

    4)和3道理一样,i到98,因为是先加再用,最后一次i=98,加1后为99,所以最终m=99.点评,这个和(3)一样容易搞错。

    参考:http://nannan408.iteye.com/blog/1238745

    http://wenku.baidu.com/view/84460478168884868762d664.html

  • 相关阅读:
    三范式
    解决Linux下乱码
    ER概念模型
    20140607
    PHP Fatal error: Class 'Yaf_Application' not found
    PHP流式读取XML文件
    php反射的使用
    wget 和curl 进行post数据
    crontab
    Leetcode OJ: Gray Code
  • 原文地址:https://www.cnblogs.com/youxin/p/3281645.html
Copyright © 2011-2022 走看看