标签:左右 寻址 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 (正常) }
标签:左右 寻址 nbsp 改变 ati 地址 寄存器 程序更新 关键字
原文地址:http://www.cnblogs.com/linuxAndMcu/p/7353076.html