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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了++i和i++的区别以及volatile相关的知识,希望对你有一定的参考价值。

#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的主要内容,如果未能解决你的问题,请参考以下文章

小程序里let和var以及const区别

请问微信小程序let和var以及const有什么区别

C++ | 调试 ·?从汇编代码看i++和++i的区别

微信小程序var和let以及const的区别:

字符串的拷贝有哪些方式,以及memcpy和strcpy的区别

《线性表的插入和删除算法实现》以及《栈和队列的插入和删除算法实现》的c语言代码