关于vc变量定义顺序猜测

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


//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
",*(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
",*(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
",*(p++),*(p-1),*(p-2));
}


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

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

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

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

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

原文地址:https://www.cnblogs.com/sjw1357/p/3864021.html