2016-01-17 5 views

ответ

7

Оба заявления являются недопустимыми, так что вы по праву спутать, но по разным причинам:

  • Лексическая ошибка возникает, когда компилятор не распознает последовательность символов в качестве надлежащих лексических маркеров. 2ab не является действительным значком C. (Обратите внимание, что 2ab - это действительный токен предварительной обработки C, который можно использовать при вставке макросов, но это кажется выше вашего текущего уровня квалификации).

  • Синтаксическая ошибка возникает, когда последовательность токенов не соответствует директиве C: statement, expression, preprocessing directive ... int 2; является синтаксической ошибкой, поскольку тип запускает определение, а число не является ожидаемым токеном в такой контекст: идентификатор или, возможно, *, a (, ожидается спецификатор или квалификатор.

Обратите внимание, что классификаторы и типа или хранения спецификаторы могут появляться в значительной степени любом порядке в объявлениях C:

int typedef const long cint;  // same as typedef const long int cint; 
int volatile static short x;  // same as static volatile short int x; 
int long unsigned long extern ll; // same as extern unsigned long long int ll; 

выше действительные заявления являются примерами изменений вы должны не использование ;-)

+0

OMG, что 'typedef' не должен быть первым ударом меня! –

+1

@JohnHascall: мой любимый девиз: * узнайте что-то новое каждый день! * Я использовал C в течение 35 лет, и я не понимал этого, пока не написал свой третий C-парсер. – chqrlie

+0

@chqrlie, извините, но '2ab' распознается в C как ** два ** токена (число' 2', за которым следует идентификатор 'ab'). Лексическая ошибка - это, например, неисчерпаемая строка (что-то как' abc '), который недопустим даже как один символ' ''. –

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