题
我有一个看起来像这样的宏:
Foo(x) ((x - '!') & 070)
如果我调用以下代码:
Foo('1') => 16
但是,如果我调用以下代码:
(('1' - '!') & 70) => 0
所以我的问题是,这里发生了什么?为什么 x & 070
计算到 x
但 x & 70
计算为0?
我的猜测是,左侧的额外0迫使60次获得2个字节而不是1。
0000 0000 0001 0000 '16
0000 0000 0100 0110 & '70
-------------------
0000 0000 0000 0000
解决方案
在C ++中,带有领先的常数 0
是一个八进制常数,而不是小数长。它仍然是整数常数,但是 070 == 56
.
这是行为差异的原因。
其他提示
不,额外的0表示该数字被读为八进制(基数8)。这意味着它没有说70,而是56:
0000 0000 0001 0000 '16
0000 0000 0011 1000 & '56
-------------------
0000 0000 0001 0000
准备 070
与 0
就像您正在这样做一样,告诉编译器将其解释为八分之一,而不是十进制。你可能想说 70
.
正如其他人所说的 070
是八分之一(并且 0x70
十六进制)常数,这是您的问题所在。
不过,我想补充一点,您应该使用 inline
功能而不是宏:
inline int Foo(int x) { return (x - '!' & 070); }
C ++已经做了很多事情,使我们能够摆脱许多事情,因为这是不良,行为不当和危险的。如果可以的话,请这样做。
(如果您使用它,至少对那些以后必须处理代码的人有怜悯。)
不隶属于 StackOverflow