2012-01-09 2 views
3

Рассмотрим этот код:Пространство между «+» и «=» в операторе + =

#include <iostream> 

int main() 
{ 
    int iTemp = 0; 

    iTemp += 1;  // Valid 

    iTemp + = 1; // This gives an error (note the space between '+' and '=') 

    return 0; 
} 

Если анализатор автоматически не потребляли это место и проверили на наличие «=», как «+ = 'также является действительным токеном, а не бросает ошибку?

Точно так же я получаю сообщение об ошибке для этого < iostream>

Может кто-то пожалуйста объяснить.

+0

Это присваивает 1 «iTemp» и «», и компилятор не знает, как его обрабатывать. –

+7

Как вы думаете, 'int imidate (10);' и 'запугать (10);' должно быть одно и то же? –

+0

Интересно, что вы ожидаете от компилятора для '+ + + + + + + + + + + + +' – PlasmaHH

ответ

8

Не работает.
Первым шагом компиляции C является токенизация - нарушение последовательности символов для разделения элементов языка. Например:
int x=333; становится списком int, x, =, 333 и ; '.
Как только это будет сделано, компилятор может определить, какой токен означает, что и как их сочетать.

Если токенизация видит последовательность +=, она генерирует один токен. Если он видит пробел, он генерирует два: + и =.

+1

+1 для выражения первого базового шага любого компилятора. Когда вы узнаете, как это работает, вы менее изумились ошибками ... (хотя некоторые утверждают, что тогда вы получите меньше диких идей) –

+0

Рассмотрите этот случай сейчас: '#include < iostream >' В соответствии с вашим объяснением он получит tokenized в - '#', 'include',' <',' iostream', '>' и не должно вызывать никаких ошибок!? –

+0

Я думаю, что '# include < iostream >' (с пробелами по всему) действительно. Однако предварительная обработка выполняется перед компиляцией и ведет себя несколько иначе (например, вы можете использовать ее для вставки '+' с '=' get '+ ='). – ugoren

12

Нет, анализатор не должен иметь. Спецификация языка требует такого поведения, и это конец истории.

+0

Причина для включения iostream в этом тоже тоже (спецификация языка)? '#include < iostream >' –

+0

iostreams были изобретены много лет спустя, чем основные лексические правила C, и решить другую проблему. Там практически нет отношений. – bmargulies

+0

Что я спросил, это прекрасно работает '#include '. Но это не '#include < iostream >' (обратите внимание на пробелы)!? –

4

Нет, этого не должно быть. Парсер очень хорош, но не читает умы. Он не может знать, является ли ошибка «плюс» или «равно» ошибкой или если интервал является ошибкой. В любом случае, все это ошибка.

3

Номер += - это единственный токен. + и = также являются одними токенами соответственно.

3

В спецификации указывается оператор +=, а не + =. Так что ответ - нет. while ключевое слово не может быть заменено на whi le, это то же самое для + =

3

Помню, еще в темные века, когда токены op= имели альтернативные варианты =op. Таким образом, x =+ 5 означает то же, что и x += 5. Это было катастрофически, конечно, потому что x=-5 означал x -= 5 вместо x = -5. Но даже в тот ранний срок эти составные жетоны не позволяли содержать пробелы.

3

+, = и + = - разные операторы. Поэтому, если вы укажете пробел между + и =, сканер будет обозначать эти операторы как разные операторы. И в результате анализатор синтаксиса (Parser) даст синтаксическую ошибку.

+0

Как насчет этого? '#include < iostream >'. Я получаю ошибку в этом, хотя он будет правильно обозначен в '#', 'include',' <',' iostream', '>'!? –

0

Зачем это работало?
Если вы попытаетесь увеличить a = a+ +, это не сработает.

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