关于i++和++i
因为要换系统,所以把之前的博客都传上来,年代久远所以写的有点…
i++
function()
{
tmp = i;
i = tmp + 1;
return tmp;
}
- 单独分配了内存
++i
function()
{
i = i + 1;
return i;
}
- 和i共享了内存
看个例子
#include<stdio.h>
int main(int argc, char* argv[])
{
int i = 3;
printf("%d,%d,%d\n",i++,++i,i);
}
输出结果为:
-
原因:
1.printf的执行顺序是从右往左执行的
2.i和++i都共享一个内存
3.i++会为表达式单独分配内存
-
执行的过程:
1.先执行i=3;
2.再执行++i,i=4;
3.执行i++,先为表达式分配内存,表达式的值为4,然后i+1变为5,即i=5,那个内存为5
4.最后输出的时候,i++这个表达式的值为4,而++i和i都用此时为i分配的内存的值,也就是5
关于i++和++i的线程安全
- 如果i是局部变量,那么线程是安全的。因为局部变量是线程私有的,别的线程访问不到。
- 如果i是全局变量,那么线程是不安全的。因为,同一进程中的不同线程都有可能访问到。
- 如果由大量线程同时执行i++的操作,i变量的副本拷贝到每个线程的线程栈,当同时有两个线程栈以上的线程读取线程变量,假如此时是一的话,那么同时执行i++操作,在写到全局变量,最后两个线程执行完,i不会是2。