关于C语言中的static变量的问题

下面的代码最终结果为什么是-10?去掉这个函数中的static则结果是-2可以理解,请教一下加了static后这个变量在函数的多次调用中是如何变化的

int fun()
{
static int a = 1;
return ++a;
}

int main()
{
int b;
b = fun()-fun()*fun();
printf("%d\n",b);
return 0;
}

这个跟static无关,跟计算的顺序有关,首先第一个fun=2进入堆栈,但是,由于后面是减号,应该先计算乘法,fun数值为2在堆栈中,
后面的乘法好理解一个是3,一个是4,最终的结果是2-3*4=-10

嗷嗷,但是我刚刚测试去掉函数中的static然后结果就变了,所以说,static变量值是可以保留且可以更改的。刚刚一直以为按照运算优先级乘法先算,第二个fun先被调用,然后第三个fun,最后是第一个fun

这属于编译器未定义行为。也就是说,fun()-fun()*fun();究竟谁先求值,这个不一定。
在你的编译器上,从左往右求值,得到2-3*4,然后计算得到-10
你觉得应该是4-2*3,但是不一定。求值的顺序和求值后表达式中运算符优先结合不是一码事。

请注意,这是编译器未定义行为,结果是-10,或者-2,或者任何值都有可能。取决于不同的编译器的实现,或者同一个编译器的不同优化方法。在实际编程中,绝对不要这么写。
关于什么是编译器未定义行为,自己google下。

恩,我在vc和vs2012上进行了测试都是这个值

这是C语言的未定义行为,由编译器具体实现,具体结果看编译器,最好别这么用。

static关键字为静态,
b = fun()-fun()*fun()=2-3*4;
第一个fun()初始值为a=1 调用后a=2(即为返回值)
第二个fun()初始值为第一个fun()修改的a=2 调用后a=3(即为返回值)
第三个fun()初始值为第二个fun()修改的a=3 调用后a=4(即为返回值)

无static时 默认auto
fun()_初始值**都**_为a=1 调用后a=2(即为返回值)

static定义变量之后,变量的初始化只进行一次,每次调用函数时,都不会再进行初始化,变量值得变化会一直保存下来。