void foo() { if(a <= 0) { a++; } else { a--; } printf("%d", a); }
1 voidfoo() { 2 if(a <= 0) { 3 4 a++; 5 6 } 7 else{ 8 9 a--; 10 11 } 12 printf("%d", a); 13 }
比较蠢但是直观的方法: 1.线程一从头到尾执行一次,然后线程二从头到尾执行一次; 输出 1,0 ; B 2.线程一执行到第3行的时候(还没有开始执行a++), 失去cpu执行权,线程二拿到cpu执行权,此时也到了第3行,然后线程一执行完毕后,再执行线程二。 这时输出的是1,2; C 3.线程一和线程二依次执行到第3行,此时线程一执行到第五行,a=1,然后线程二执行到第五行a=2,最后输出 2,2; D 0,1这种,无论什么情况下都是不会发生的
对于C选项:初始为0,P1执行完判断语句,决定要执行a++,中断,P2进行判断,此时a仍然等于0,执行判断语句,并执行输入,得到1,P1然后继续执行,此时它该执行a++,这时a=1,执行并输出,结果为2;
对于D答案:初始为0,P1执行完判断语句,决定要执行a++,中断,P2进行判断,此时a仍然等于0,执行a++,得到a=1,中断,P1继续执行a++,a=2,P1输出,得到2,P1结束,P2继续执行输出语句,得到2;