为什么输出中间变量会影响最终结果?

这是一段错误的代码。
(如算法错误,双精度sum用整型定义,直接写(-1)的n次方等)
但我发现了一个很奇怪的现象:

#include<iostream>
#include<cstdio>
using namespace std;

int n;
int sum;

int main()
{
    scanf("%d\n",&n);
    for(int i=1;i<=n;i++)
    {
        double a=(double)1/n;
        int b=n-1;
        int z=(-1)^b;
        printf("%.4lf %d %d\n",a,b,z);
        sum+=(double)z*a;
    }
    printf("%.4lf\n",sum);
    return 0;
}

为什么中间的变量输出(printf("%.4lf %d %d\n",a,b,z);)
会改变结果输出?
如:将该句注释掉后,输出为:图片说明
但将该句取消注释后变为:图片说明

可见答案从0.0000变为0.5000;

(ps.本人初学,还请细心解释,非常感谢)

https://q.cnblogs.com/q/124984/