关于vc变量定义顺序猜测

来源:互联网 发布:知乎小说推荐知乎言情 编辑:程序博客网 时间:2024/06/05 15:19

没事上在网上看到网友提问指针加减的问题,看到个很有意思的现象——变量声明和地址的关系,大胆猜测一下,望指正。
下面两个小程序的输出是什么?


//code 1#include<stdio.h>void main(){ int a=1,b=2,c=3; int *p=&a; *(p++); printf("a=%d,b=%d,c=%d\n",*(p-1),*(p-2),*(p-3));}

//code 2#include<stdio.h>void main(){ int a=1; int b=2; int c=3; int *p=&a; printf("a=%d,b=%d,c=%d\n",*(p++),*(p-1),*(p-2));}

//code 3#include<stdio.h>void main(){volatile int a=1;volatile int b=2;volatile int c=3;volatile int *p=&a; printf("a=%d,b=%d,c=%d\n",*(p++),*(p-1),*(p-2));}


代码1的输出为a=1,b=2,c=3。。。查看三个变量地址:

原来我们声明变量虽然是按照a,b,c 的顺序,但是编译器和我们理解的不同,反倒是c的内存地址在前。。。这样就好理解了。

代码2是想尝试逐次定义的,但是结果竟然和代码1完全一样。忽然想起来有个编译器优化。

代码3的结果和图片也相同。

因此就猜测编译顺序和定义顺序不同造成的,希望知道答案的高手给个信。