c++ - valores - si celda contiene palabra




Definiciones extrañas de macros VERDADERAS y FALSAS (4)

Comencemos con la verdad. Puede leerlo como '/' / '/' , que significa "carácter '/' dividido por el carácter '/'". Como cada carácter, en C, es un valor numérico (en un byte), puede leerse como "el valor ASCII del carácter '/' dividido por el valor ASCII de ese mismo carácter", lo que significa 1 (porque, obviamente, x / x es 1). Por lo tanto, TRUE es 1.

Para FALSE , es el mismo razonamiento: '-'-'-' lee '-' - '-' , es decir, "el valor ASCII de '-' menos el valor ASCII de '-'", que es 0. Por lo tanto, FALSE es 0.

Esta es una forma desagradable de decir lo obvio.

He visto las siguientes definiciones de macro en un libro de codificación.

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

No había explicación allí.

Por favor explíqueme cómo funcionarán como TRUE y FALSE .


Es equivalente a escribir

#define TRUE 1
#define FALSE 0

Lo que realmente hace la expresión '/'/'/' es dividir el carácter / (cualquiera que sea su valor numérico) por sí mismo, por lo que se convierte en 1 .

Del mismo modo, la expresión '-'-'-' resta el carácter - de sí mismo y se evalúa a 0 .

Sería mejor escribir

#define TRUE ('/'/'/')
#define FALSE ('-'-'-')

para evitar el cambio accidental de valores cuando se usa con otros operadores de mayor precedencia.


Es una forma divertida de escribir macros para True y False .

Como se han proporcionado muchas explicaciones / significa un número de 1 byte (según ASCII) cuando se divide por sí mismo, le da 1 que se tratará como True y, de la misma manera - es nuevamente un número de byte cuando se resta el mismo valor que le da 0 que ser interpretado como false

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

por lo tanto, podemos reemplazar / o - con cualquier carácter que queramos, por ejemplo:

#define TRUE  '!'/'!'
#define FALSE 'o'-'o'

Mantendrá el mismo significado que la expresión original.


Veamos: '/' / '/' significa el literal de char / , dividido por el literal de char '/' sí. El resultado es uno, que suena razonable para TRUE .

Y '-' - '-' significa el literal char '-' , sustraído de sí mismo. Esto es cero ( FALSE ).

Hay dos problemas con esto: primero, no es legible. Usar 1 y 0 es absolutamente mejor. Además, como han señalado TartanLlama y KerrekSB, si alguna vez va a utilizar esa definición, agregue paréntesis a su alrededor para que no tenga sorpresas:

#include <stdio.h>

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

int main() {
        printf ("%d\n", 2 * FALSE);
        return 0;
}

Esto imprimirá el valor del char literal '-' (45 en mi sistema).

Con paréntesis:

#define TRUE  ('/'/'/')
#define FALSE ('-'-'-')

el programa imprime correctamente cero, a pesar de que no tiene mucho sentido multiplicar un valor de verdad por un entero, pero es solo un ejemplo del tipo de errores inesperados que podrían morderlo si no pone entre paréntesis sus macros.





obfuscation