5

次のようなマクロがあります。

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

次のコードを呼び出すと:

Foo('1') => 16

ただし、次のコードを呼び出すと、次のようになります。

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

だから私の質問は、ここで何が起こっているのかということです。なぜx & 070計算xするx & 70のに0まで計算するのですか?

私の推測では、左側の余分な0は、60に1ではなく2バイトを強制していると思います。その場合、ビット単位の&は次のようになりませんか?

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

4 に答える 4

12

C ++では、先頭の付いた定数0は10進数の定数ではなく、8進数の定数です。それはまだ整数定数ですが、070 == 56

これが行動の違いの原因です。

于 2010-07-01T18:12:05.397 に答える
7

いいえ、余分な0は、数値が8進数(基数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している0ようなものを前に付けると、コンパイラはそれを10進数ではなく8進数として解釈するように指示されます。あなたはおそらく言いたいでしょう70

于 2010-07-01T18:13:39.973 に答える
3

他の人が言ったように070、8進数(および0x7016進数)の定数であり、ここに問題があります。

inlineただし、マクロの代わりに関数を使用する必要があることを追加したいと思います。

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

C ++は、プリプロセッサが悪く、誤動作し、危険であるため、多くのことでプリプロセッサを取り除くために多くのことを行ってきました。あなたがそれなしでできるなら、そうしてください。
(そして、それを使用する場合は、少なくとも、マクロをすべて大文字にするために後でコードを処理する必要がある人を憐れんでください。)

于 2010-07-01T18:19:47.947 に答える