Pregunta

Tengo una macro que se ve algo como esto:

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

Si llamo el siguiente código:

Foo('1') => 16

Sin embargo, si llamo el siguiente código:

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

Así que mi pregunta es, ¿qué está pasando aquí? ¿Por qué el cálculo x & 070 a x pero cómputo x & 70 a 0?

Mi conjetura es que el extra 0 a la izquierda está obligando a tomar 60 2 bytes en lugar de 1. En ese caso, sería no el bit a bit y ser el siguiente?

0000 0000 0001 0000     '16
0000 0000 0100 0110 &   '70
-------------------
0000 0000 0000 0000
¿Fue útil?

Solución

En C ++, una constante con un 0 líder es una constante octal, no una constante decimal. Todavía es una constante entera pero 070 == 56.

Esta es la causa de la diferencia de comportamiento.

Otros consejos

No, el 0 medios adicionales el número se lee como octal (base 8). Eso significa que no dice 70, pero 56:

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

agregar el prefijo a la 070 con un 0 como usted está haciendo le dice al compilador que interpretarlo como octal, no decimal. Probablemente quiere decir 70.

Como otros han dicho, es un 070 octal (y 0x70 un hexadecimal) constante, que es donde sus mentiras problemas.

Me gustaría añadir, sin embargo, que se debe utilizar funciones inline en lugar de macros:

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

C ++ ha hecho mucho para que podamos deshacernos del preprocesador para muchas cosas, porque es malo, se portan mal, y peligroso. Si se puede prescindir de él, que lo hagan.
(Y si lo usa, al menos, tener la piedad de los que tienen que lidiar con el código más tarde para hacer macros todo en mayúsculas.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top