Что такое & ldquo; if-else & rdquo; двусмысленность в C? [Дубликат]

Вы не можете удалить из списка, если вы просматриваете его с циклом «для каждого».

Вы не можете удалить элемент из коллекции, которую вы выполняете. Вы можете обойти это, явно используя Итератор и удалив там элемент. Вы можете использовать Итератор.

Если вы используете код ниже, вы не получите никакого исключения:

private static void removeLalala(Collection<String> c) 
  {
    /*for (Iterator<String> i = c.iterator(); i.hasNext();) {
      String s = i.next();
      if(s.equals("lalala")) {
        c.remove(s);
      }
    }*/

    Iterator<String> it = c.iterator();
    while (it.hasNext()) {
        String st = it.next();
        if (st.equals("lalala")) {
            it.remove();
        }
    }
  }
4
задан Peter Mortensen 24 September 2009 в 21:29
поделиться

4 ответа

Которое if принадлежит else к?

if (a < b)
    if (c < d)
        a = b + d;
    else
        b = a + c;

(Очевидно, вы должны игнорировать отступ.)

Это «проблема с зависанием еще».

C / C ++ избавляет от двусмысленности тем, что имеет правило, в котором говорится, что вы не можете иметь if -without-an- else в качестве if -го тела an- if -с-An- else.

7
ответ дан RichieHindle 18 August 2018 в 18:21
поделиться
  • 1
    Честно говоря, я никогда не понимал проблемы. Я неопытен в области языков, но каждый, который я использовал, определяет поведение просто отлично. если вместо этого проблема заключалась в том, что (1) если (some_condition) a = 1; ; else b = 1; то это совершенно другой поток контроля в C (по сравнению с потоком, который вы опубликовали), например. – San Jacinto 24 September 2009 в 21:36
  • 2
    @Steven: Я не программист на C #, и поэтому я могу ошибаться, но я не знал, что есть один и только один редактор. ;) – Troubadour 24 September 2009 в 21:45
  • 3
    «C / C ++ избавляется от двусмысленности, имея правило, в котором говорится, что вы не можете иметь if, если без else, как тело if. & quot; Конечно вы можете. if (a < b) if (c < d) a = b + d;. – avakar 24 September 2009 в 21:50
  • 4
    @Peter: Я сделал это заявление бесконечно более понятным введением нескольких дефисов. 8-) – RichieHindle 24 September 2009 в 21:50
  • 5
    Я думаю, что более простой способ объяснить правило C / C ++ является обычным: else всегда связывается с ближайшим сопоставлением if. – Pavel Minaev 24 September 2009 в 21:58

Неоднозначное другое.

Некоторая информация здесь: http://theory.stanford.edu/~amitp/yapps/yapps-doc/node3.html

Но классический пример:

if a then
  if b then
     x = 1;
  else 
     y = 1;

vs.

if a then
  if b then
     x = 1;
else 
  y = 1;
10
ответ дан Joe 18 August 2018 в 18:21
поделиться
  • 1
    С точки зрения парсера, проблема в том, что вы не можете разрешить двусмысленность из производств только в грамматике языка. Парсеру нужна дополнительная информация, в частности правило, в котором говорится, как его решить. (Все языки, на которых я знаю, имеют правило, согласно которому else связывается с последним, если.) – Adrian McCarthy 24 September 2009 в 22:29

Я не вижу проблемы для Pascal?

Этот неверный отступ.

if a then
  if b then
     x = 1;
  else
     y = 1;

Удаление полуколоны после x = 1 сделает ее правильной с отступом.

Этот правильный отступ

if a then
  if b then
     x = 1;
else
  y = 1;
2
ответ дан Peter Mortensen 18 August 2018 в 18:21
поделиться
  • 1
    За исключением того, что C ++ обычно не разбирается с парсером сдвига (например, LR (k)). ;) – avakar 25 September 2009 в 09:42
  • 2
    Возможно, нет. Но концепция одинакова, и я не хотел обсуждать все потенциальные схемы синтаксического анализа, поскольку на самом деле она не казалась relavant. – Martin York 25 September 2009 в 17:39
  • 3
    Почему у Паскаля не было этой проблемы? Он имеет как составные блоки, так и неметаллические блоки. – Peter Mortensen 18 June 2018 в 16:36
  • 4
    – Code-Apprentice 18 June 2018 в 16:49
2
ответ дан Peter Mortensen 30 October 2018 в 06:55
поделиться
Другие вопросы по тегам:

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