Почему имена переменных не могут начинаться с цифр? - PullRequest
124 голосов
/ 05 декабря 2008

Я работал с новым разработчиком C ++ некоторое время назад, когда он задал вопрос: «Почему имена переменных не могут начинаться с цифр?»

Я не мог придумать ответ, за исключением того, что некоторые числа могут содержать текст (123456L, 123456U), и это было бы невозможно, если бы компиляторы думали, что все с некоторым количеством буквенных символов является именем переменной.

Это был правильный ответ? Есть еще причины?

string 2BeOrNot2Be = "that is the question"; // Why won't this compile?

Ответы [ 24 ]

4 голосов
/ 14 декабря 2014

COBOL позволяет переменным начинаться с цифры.

4 голосов
/ 12 января 2012

Ограничение произвольно. Различные Лиспы позволяют именам символов начинаться с цифр.

4 голосов
/ 14 января 2013

Имена переменных не могут начинаться с цифры, потому что это может вызвать некоторые проблемы, как показано ниже:

int a = 2;
int 2 = 5;
int c = 2 * a; 

каково значение с? 4 или 10!

другой пример:

float 5 = 25;
float b = 5.5;

является первым 5 числом или является объектом (. Оператор) Есть аналогичная проблема со вторым 5.

Может быть, есть и другие причины. Таким образом, мы не должны использовать какую-либо цифру в начале имени переменной.

2 голосов
/ 05 декабря 2008

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

0x, 2д, 5555

2 голосов
/ 06 ноября 2009

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

Разве не Дайкстра сказал, что "самый важный аспект любого инструмента - это его влияние на пользователя"?

1 голос
/ 23 ноября 2013

компилятору легко идентифицировать переменную, используя ASCII, в ячейке памяти, а не по номеру.

1 голос
/ 02 мая 2009

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

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

1 голос
/ 20 мая 2009

Предположим, вы позволили именам символов начинаться с цифр. Теперь предположим, что вы хотите назвать переменную 12345foobar. Как бы вы дифференцировали это от 12345? Это на самом деле не очень сложно сделать с регулярным выражением. Проблема на самом деле заключается в производительности. Я не могу действительно объяснить, почему это очень подробно, но по сути это сводится к тому, что для дифференциации 12345foobar от 12345 требуется возврат. Это делает регулярное выражение недетерминированным.

Здесь гораздо лучше объяснение .

0 голосов
/ 05 августа 2018

В этом не может быть ничего плохого, когда вы объявляете переменную. Но есть некоторая неоднозначность, когда он пытается использовать эту переменную где-то еще так:

let 1 = "Привет, мир!" Печать (1) печать (1)

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

0 голосов
/ 05 августа 2018

Компилятор имеет 7 фаз следующим образом:

  1. Лексический анализ
  2. Синтаксический анализ
  3. Семантический анализ
  4. Промежуточная генерация кода
  5. Оптимизация кода
  6. Генерация кода
  7. Таблица символов

В процессе лексического анализа во время компиляции фрагмента кода не требуется возврата. Такая переменная, как Apple, компилятор сразу узнает свой идентификатор, когда встретит букву «А» на этапе лексического анализа. Однако такая переменная, как 123apple, компилятор не сможет решить, является ли ее число или идентификатор, пока он не достигнет «a», и ему необходимо вернуться назад, чтобы перейти на фазу лексического анализа, чтобы определить, является ли она переменной. Но это не поддерживается в компиляторе.

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

...