奇怪的除法结果(C ++ / Xcode)

时间:2013-10-02 10:12:11

标签: c++ xcode division

我在这里有点新意,所以如果我做错了,请原谅我。在发布此内容之前我做了一些搜索,但没有得到任何结果。所以关于这个主题:当AI代理表现得很奇怪时,我收到了一个错误,所以我起草了一些printf来看看发生了什么。

事实证明这是一个简单划分的错误结果:

#define WORLD_HEIGHT 42
#define VIEWPOINT_CONSTANT 9

printf ("%d/%d=%d\n", WORLD_HEIGHT, VIEWPOINT_CONSTANT, WORLD_HEIGHT/VIEWPOINT_CONSTANT);

输出:

42/9=6

然后我做了以下工作来检查编译器等:

printf ("%d/%d=%d\n", 42, 9, 42/9);

输出:

42/9=4        

不确定这是否是Xcode错误或C ++中的某些东西(虽然我怀疑它是后者,然后再次前者也不太可能)。为了确保我没有忽略任何东西,我甚至将常数放在printf中。

如果有人知道这个问题可能是什么原因或如何解决它(虽然仍然保留#define而不是用数字替换它们),我们将不胜感激。< / p>

干杯!

1 个答案:

答案 0 :(得分:4)

我的猜测是你没有向我们展示真实的代码,你实际拥有的是这样的:

#define WORLD_HEIGHT 42
#define VIEWPOINT_CONSTANT 8+1

printf ("%d/%d=%d\n", WORLD_HEIGHT, VIEWPOINT_CONSTANT, WORLD_HEIGHT/VIEWPOINT_CONSTANT);

这会给出您看到的结果,因为42/8+142/9不同 - 它被评估为(42/8)+1,即5+1,因此您将获得价值6而不是4。这可以通过使用括号来强制执行所需的评估顺序来修复,即

#define VIEWPOINT_CONSTANT (8+1)

或更好的是,使用更合适的方法来定义常量而不是预处理器宏,例如

const int WORLD_HEIGHT = 42;
const int VIEWPOINT_CONSTANT = 8+1;

(请注意,上述声明会消除问题,不再需要括号。)

我们今天学到的经验教训:

  • 始终在#define s中使用括号(或者更好地使用const,因为这是2013年,而不是1983年)
  • 始终在StackOverflow上发布实际代码!