o no es válido C++: ¿por qué se compila este código?


Aquí hay una aplicación C++ muy simple que hice con QtCreator:

int main(int argc, char *argv[])
{
    int a = 1;
    int b = 2;

    if (a < 1 or b > 3)
    {
       return 1;
    }
    return 0;
}

Para mí, esto no es C++ válido, ya que la palabra clave o no es una palabra clave reservada.

Pero si compilo y lo corro, ¡funciona bien sin advertencias ! El código de salida es 0 y si cambio b = 4, el código de salida es 1 !

No estoy incluyendo nada para asegurarme de que no haya una definición oculta.

Esto es realmente extraño para mí. ¿Es esto algo que Qt está definiendo ? No encontré nada en el documentación al respecto.

Author: Meysam, 2009-09-16

3 answers

De acuerdo con Wikipedia :

C++ define las palabras clave para que actúen como alias para un número de símbolos que funcionan como operadores: and ( & & ), bitand (&), and_eq ( & = ), or ( / / ), bitor ( / ), or_eq ( / = ), xor ( ^ ), xor_eq ( ^ = ), not (!), not_eq (!= ), compl (~).

Como MadKeithV señala, estos reemplazos vinieron de la iso646 de C.h, y se incluyeron en ISO C++ como palabras clave del operador. El artículo de Wikipedia para iso646.h dice que la razón de estos palabras clave era de hecho para teclados internacionales y otros no QWERTY que podrían no haber tenido fácil acceso a los símbolos.

 54
Author: Thomas Owens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:53:17

or es una palabra clave de C++, y se le permite usarla en lugar de ||. No hay magia.

Lo mismo ocurre con and y la mayoría de los otros operadores lógicos. Por lo general, es mejor atenerse a los nombres comúnmente conocidos, sin embargo, para evitar confusiones como esta. Si usas or, alguien se preguntará" por qué compila esto";)

 16
Author: jalf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-16 14:35:35

Iso646.h define una serie de alternativas de operador - es parte del estándar C++.

 7
Author: Joris Timmermans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-16 14:38:04