5

我有一个看起来像这样的宏:

Foo(x) ((x - '!') & 070)

如果我调用以下代码:

Foo('1') => 16

但是,如果我调用以下代码:

(('1' - '!') & 70) => 0

所以我的问题是,这里发生了什么?为什么x & 070计算到xx & 70计算到0?

我的猜测是左侧的额外 0 迫使 60 占用 2 个字节而不是 1。在这种情况下,按位 & 不会如下所示吗?

0000 0000 0001 0000     '16
0000 0000 0100 0110 &   '70
-------------------
0000 0000 0000 0000
4

4 回答 4

12

在 C++ 中,带前导0的常量是八进制常量,而不是十进制常量。它仍然是一个整数常量,但是070 == 56.

这就是行为差异的原因。

于 2010-07-01T18:12:05.397 回答
7

不,额外的 0 表示该数字被读取为八进制(以 8 为基数)。这意味着它不是说 70,而是 56:

0000 0000 0001 0000     '16 
0000 0000 0011 1000 &   '56
------------------- 
0000 0000 0001 0000 
于 2010-07-01T18:12:11.163 回答
3

正如其他人所说,070是一个八进制(和0x70十六进制)常量,这就是您的问题所在。

不过,我想补充一点,您应该使用inline函数而不是宏:

inline int Foo(int x) { return (x - '!' & 070); }

C++ 做了很多工作,让我们可以在很多事情上摆脱预处理器,因为它是坏的、行为不端的和危险的。如果你可以不用它,那就去做吧。
(如果你使用它,至少对那些必须稍后处理你的代码以使宏全大写的人有怜悯之心。)

于 2010-07-01T18:19:47.947 回答
3

在前面070加上0你正在做的事情告诉编译器将其解释为八进制,而不是十进制。你大概想说70

于 2010-07-01T18:13:39.973 回答