или не является допустимым C ++: почему этот код компилируется? - PullRequest
24 голосов
/ 16 сентября 2009

Вот очень простое приложение на C ++, которое я сделал с помощью QtCreator:

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

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

Для меня это недопустимый C ++, так как ключевое слово или не является зарезервированным ключевым словом.

Но если я скомпилирую и запустлю его, он будет работать без каких-либо предупреждений! Код выхода равен 0, и если я изменю b = 4, код выхода будет 1!

Я не включаю ничего, чтобы убедиться, что нет скрытого определения.

Это действительно странно для меня. Это то, что определяет Qt? Я не нашел ничего в документации по этому поводу.

Ответы [ 3 ]

54 голосов
/ 16 сентября 2009

Согласно Википедии :

C ++ определяет ключевые слова в качестве псевдонимов для ряда символов, которые функционируют в качестве операторов: и (&&), бит и (&), and_eq (& =) или (||), битор (|) или or_eq (| =), xor (^), xor_eq (^ =), а не (!), not_eq (! =), compl (~).

Как указывает MadKeithV , эти замены произошли из iso646.h в C и были включены в ISO C ++ в качестве ключевых слов оператора. В статье Wikipedia для iso646.h говорится, что причина этих ключевых слов действительно была для международных и других клавиатур, отличных от QWERTY, которые могли не иметь простого доступа к символам.

16 голосов
/ 16 сентября 2009

or - это ключевое слово C ++, и вы можете использовать его вместо ||. Там нет магии.

То же самое касается and и большинства других логических операторов. Обычно лучше придерживаться общеизвестных имен, чтобы избежать такой путаницы. Если вы используете or, кто-то задастся вопросом «почему эта компиляция»;)

7 голосов
/ 16 сентября 2009

iso646.h определяет ряд альтернатив операторов - это часть стандарта C ++.

...