码迷,mamicode.com
首页 > 其他好文 > 详细

++i和i++的区别以及volatile

时间:2017-08-13 14:18:48      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:左右   寻址   nbsp   改变   ati   地址   寄存器   程序更新   关键字   

#include <stdio.h>

/*
1 首先两者的区别是:前者是先赋值,然后再自增;后者是先自增,后赋值

2 ++i和i++都是分两步完成的。因为++i 是后面一步才赋值的,所以它能够
    当作一个变量进行级联赋值,++i = a =b,即 ++i 是一个左值(可被寻址的值);
    i++ 的后面一步是自增,不是左值。(2的两步分解与左右值的因果关系只
    是我的直觉,对错还待考证)
*/
// i++: res=i;i=i+1
// ++i: i=i+1;res=i;

/*
  volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次
  需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,
  则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,
  将出现不一致的现象。
 */
int main()
{


    int i = 3;
    int res = i++ + i++ + i++;    // 1:res=i=3; 2:res+=i=3 3:res+i=3  所有赋值完成后 i=i+1;
    printf("res = %d,i = %d\n",res,i);    //==3+3+3 = 9

    int j = 3;   //编译器对k进行了优化:k被读入某个寄存器
    res=0;
    res = ++j + ++j + ++j;    // 1:j++;res+=i=4; 2:j++;res+=j=5; 3:i++;res+=i=6 == 7
    printf("res = %d,j = %d\n",res,j);    //==4+5+7 = 16 j=6 (异常)

    volatile int k = 3; //编译器未对j进行优化:j被读入变量地址
    res = ++k + ++k + ++k; // 1:k++;res+=k=4; 2:k++;res+=k=5; 3:k++;res+=k=6
    printf("res = %d,k = %d\n",res,k); //==4+5+6 = 15 (正常)
}

 

++i和i++的区别以及volatile

标签:左右   寻址   nbsp   改变   ati   地址   寄存器   程序更新   关键字   

原文地址:http://www.cnblogs.com/linuxAndMcu/p/7353076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!