我在这里有点新意,所以如果我做错了,请原谅我。在发布此内容之前我做了一些搜索,但没有得到任何结果。所以关于这个主题:当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>
干杯!
答案 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+1
与42/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年)