2

我在这里有点新,所以如果我做错了什么,请原谅我。在发布之前我做了一些搜索,但没有得到任何结果。继续话题:当 AI 代理行为异常时,我遇到了一个错误,所以我起草了一些printf's 来看看发生了什么。

结果证明是简单除法的错误结果:

#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's.

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

干杯!

4

1 回答 1

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+1is 不一样42/9- 它被评估为(42/8)+15+1因此您将得到一个值6而不是4。这可以通过使用括号来强制执行所需的评估顺序来解决,即

#define VIEWPOINT_CONSTANT (8+1)

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

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

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

我们今天学到的教训:

  • 总是在 s 中使用括号#define(或者更好的是使用const,因为这是 2013 年,而不是 1983 年)
  • 总是在 StackOverflow 上发布真实代码!
于 2013-10-02T10:17:15.190 回答