这是一个片段......
printf("splitBackground = %d, numWindowPoints = %d\n", splitBackground, numWindowPoints);
splitBackground = splitBackground/numWindowPoints;
printf("%d ", splitBackground);
这很好但是当我注释掉第一行代码时,结果却非常不正确。 :(
答案 0 :(得分:7)
您很可能在代码中犯了一个导致未定义行为的错误。并且“未定义”意味着“它可能在某些情况下有效”。
为什么插入printf
会使其有效?一些可能性:
它会改变程序不同部分之间或程序与世界其他地方之间的时序关系。
printf调用禁止可能发生的编译器优化。
printf调用以防止错误发生的方式更改标准库的内部状态。
printf调用以防止错误发生的方式与硬件交互。
(请注意,在调试器下运行时,许多相同的注意事项也是如此 - 因此术语“heisenbug”:只有在您不注意时才会出现的错误。)
答案 1 :(得分:1)
我个人会打印到stderr,而不是stdout。
如果您使用的是IDE,我会充分利用调试器来尝试解决您的问题。与Visual Studio 2010,Eclipse或Netbeans一样,添加断点并慢慢逐步执行代码行。
答案 2 :(得分:0)
你的printf可能有副作用(修改一些数据导致正确的结果)。在任何情况下,查看有问题的代码的简化示例将非常有帮助
答案 3 :(得分:0)
可能这是堆栈损坏,你的printf
以某种方式扩展堆栈或触发一个防护页面或其他东西。但如果没有剩下的代码,很难说出来。