Введите ограничение в переменных цикла в Java, C и C++

Я полагаю, что запуск точки с Распределенной системой управления версиями (как подвижный или мерзавец). Существуют некоторые advandtages использования его:

  1. Вы не должны устанавливать центральный репозиторий (это rquires утомительная установка сервера)
  2. , можно совместно использовать changesets (изменения) с друзьями при помощи электронного письма или другого метода, и интегрировать изменения в репозитории безопасно.
  3. можно ли изменить историю пересмотра (переоснова, мерзавец поддерживает ее), легко, что невозможно сделать с SVN.
5
задан fjsj 26 August 2009 в 23:50
поделиться

6 ответов

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

public void method(int a) {
  int outerVar = 4;
  {
    long variable = obj.operation();
    for (int i = 0; i < 15; i++) { ... }
  }
}
21
ответ дан 18 December 2019 в 05:44
поделиться

Ваш пример:

for (int i = 0, long variable = obj.operation(); i < 15; i++) { ... }

является недопустимым по той же причине, что:

int i = 0, long variable = obj.operation();

сам по себе был бы недопустимым. Запятая не запускает новый оператор. Обе части, до и после запятой, являются частью одного оператора. Этот оператор объявляет и инициализирует список переменных int . Во всяком случае, об этом сообщает компилятору идентификатор int в начале строки. длинный идентификатор после запятой является ошибкой, так как для объявления переменной (ов) другого типа необходимо начать новый оператор.

6
ответ дан 18 December 2019 в 05:44
поделиться

Итак, синтаксис предназначен для ( expr ; expr ; expr ), и вы не можете объявить две переменные разные типы в одном выражении. Так что это не имеет ничего общего с переменной цикла .

2
ответ дан 18 December 2019 в 05:44
поделиться

@jsight прав, но я думаю, что настоящая причина в простоте синтаксиса. Предположим, что Java допускает тип или новое имя переменной после первой запятой. Поскольку Java не требует прямого объявления, идентификатор, следующий за запятой, может быть новым именем переменной, существующим именем класса или именем класса, которое ранее не встречалось. Теперь с этим можно справиться, но:

  1. Это делает грамматику более сложной, возможно, не сразу очевидными способами.
  2. Это делает фазу синтаксического анализа компилятора Java более сложной.
  3. Это делает делает жизнь более сложной для других инструментов, обрабатывающих исходный код Java.
  4. Это, вероятно, приводит к более расплывчатым и / или вводящим в заблуждение сообщениям об ошибках компилятора, если есть синтаксическая ошибка в цикле for.

(IMO, синтаксическая сложность - один из недостатков C и особенно C ++. Я проделал много кода в обоих случаях, но мне до сих пор иногда трудно декодировать сообщения об ошибках синтаксиса.)

1
ответ дан 18 December 2019 в 05:44
поделиться

Просто догадываюсь - это так просто объявить "

0
ответ дан 18 December 2019 в 05:44
поделиться

Согласно спецификации , инициализация оператора for может быть списком выражений оператора, которые оцениваются и отбрасываются, или одним оператором объявления переменной. Оператор объявления переменной может объявлять несколько переменных, но все они одного типа.

Итак, вы можете сделать это:

for (int i = 0, variable = obj.operation(); i < 15; i++) { ... }

Но в этом случае переменная будет определяться как int.

0
ответ дан 18 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: