2009-09-16 3 views
24

Вот очень простой C++ приложения Я сделал с QtCreator:или недействителен C++: зачем этот код компилируется?

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 определяющим? Я ничего не нашел в документации по этому поводу.

+0

Сумасшедший! Хорошо пятнистый +1 – Justicle

+15

Что вы имеете в виду хорошо заметили? или ** является ** ключевым словом в C++. –

+0

@MichaelFoukarakis Я думаю * 'хорошо spotted' * означает *' почему этот код компилирует? '* Часть вопроса: некоторым компиляторам нужно' #include ', а некоторые нет. Большинство (если не все) IDE не выделяют эти новые «ключевые слова». – Wolf

ответ

54

В соответствии с Wikipedia:

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

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

+2

Прохладный - я писал C++ с начала 90-х, и я понятия не имел об этом. Я вряд ли когда-либо буду это понимать, но это хорошо знать. –

+0

Я тоже не знал об этом, пока не посмотрел. Мне кажется неудобным использовать, и я уверен, что есть много людей, которые пишут C++ и не знают об этом. –

+1

Я считаю, что они были добавлены, чтобы помочь людям с клавиатурами, отличными от английского, которые могут не иметь всех ключей символов (&, | и т. Д.). – KeithB

16

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

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

+0

Старый ответ, я знаю, но я просто хочу быть крутым и педантичным, поскольку они не ключевые слова, а альтернативные токены. Мальчик, я чувствую себя крутым, придирчивым и раздражающим. – GManNickG

+0

Ой, я не понимал этого различия. Но, похоже, ты прав. :) – jalf

+0

@GManNickG: это ключевые слова (по крайней мере, в текущем рабочем черновике): Раздел C.5.2.3: «Токены и, и_eq, bitand, bitor, compl, not_eq, not или or_eq, xor и xor_eq - это ключевые слова в этот международный стандарт (2.11). Они не отображаются в виде имен макросов, определенных в . " – Hannes

7

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

+0

'' пуст в C++. – avakar

+2

Это не в Visual Studio с 2003 по 2010 год (http://msdn.microsoft.com/en-us/library/bw6140c5%28VS.80%29.aspx) –

+0

Позвольте мне перефразировать: файл пуст до C++ компилятор. Проверьте источники, вы увидите, что макросы зависят от макроса '__cplusplus', который не определяется. – avakar

Смежные вопросы