Question

J'ai une macro qui ressemble à quelque chose comme ceci:

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

Si j'appelle le code suivant:

Foo('1') => 16

Cependant, si j'appelle le code suivant:

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

Alors, ma question est, ce qui se passe ici? Pourquoi x & 070 Compute à x mais x & 70 Compute à 0?

Je suppose que le 0 supplémentaire à gauche oblige 60 à prendre 2 octets au lieu de 1. Dans ce cas, ne serait pas le & bitwise être comme suit?

0000 0000 0001 0000     '16
0000 0000 0100 0110 &   '70
-------------------
0000 0000 0000 0000
Était-ce utile?

La solution

C ++, une constante avec un conduit 0 est une constante octal, pas une constante décimale. Il est encore une constante entière mais 070 == 56.

Ceci est la cause de la différence de comportement.

Autres conseils

n, les moyens supplémentaires 0 le numéro est lu comme octal (base 8). Cela signifie qu'il ne dit pas 70, mais 56:

0000 0000 0001 0000     '16 
0000 0000 0011 1000 &   '56
------------------- 
0000 0000 0001 0000 

Préfixer la 070 avec un 0 comme vous faites indique au compilateur de l'interpréter comme octal, pas décimal. Vous voulez sans doute dire 70.

Comme d'autres ont dit, 070 est un octal (et 0x70 hexadécimal) constante, ce qui est l'endroit où se trouve votre problème.

Je voudrais ajouter, cependant, que vous devez utiliser les fonctions inline au lieu de macros:

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

C ++ a fait beaucoup pour nous permettre de se débarrasser de la préprocesseur pour beaucoup de choses, parce qu'il est mauvais, mauvais comportement, et dangereux. Si vous pouvez le faire sans elle, le faire.
(Et si vous l'utilisez, au moins la pitié de ceux qui ont à traiter votre code plus tard pour faire des macros tout en majuscules.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top