c# для l oop синтаксического запроса - почему это компилируется - PullRequest
1 голос
/ 12 июля 2020

Вчера при отладке какого-то кода я, в конце концов, обнаружил строку виновника:

 for (int i=0; i <- b; i++) 

вместо:

 for (int i=0; i <= b; i++) 

Почему это компилируется? Я мог понять, если он был введен с ошибкой:

for (int i=0; i <-b; i++)

Ответы [ 4 ]

2 голосов
/ 13 июля 2020

Объясняя более абстрактную форму, в cSharp нет токена '<-', но есть два токена '<' и '-'. </p>

Когда лексический анализатор считывает символы, он проверяет, идет ли следующий символ производит любые токены, которые он может распознать (с упреждением). Если нет, он передает парсеру последний токен, который он смог идентифицировать, и переходит к идентификации следующего токена.

Пошагово:

  • < -> Token идентифицированы. Дождитесь следующей записи (вперед)
  • <- -> Неопознанный токен, передайте < синтаксическому анализатору и оставьте -
  • - -> Идентифицированный токен . Дождитесь следующей записи (вперед)
  • -b -> Неопознанный токен, передайте - парсеру и сохраните b
  • b -> Идентифицированный токен . Дождитесь следующей записи (вперед)
  • b; -> Неопознанный токен, передайте b парсеру и оставьте ;
  • И так далее ...

В конце парсер переводит это как «i <(-b)». </p>

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

В резюме не имеет значения, был ли код написан как «i <- b» или «i <-b» или «i <- b ", потому что для лексического анализатора cSharp пробел не имеет значения" i <-B ". </p>

Ссылки:

0 голосов
/ 12 июля 2020

Это не так. Взгляните на этот фрагмент:

using System;
                    
public class Program{
    public static void Main(){
        int i=0, j=-5;
        for(;i<-j;i++)
            Console.WriteLine("i: {0}, j: {1}", i, j);
    }
}

Конечный результат будет:

i: 0, j: -5                                                                                                                 
i: 1, j: -5                                                                                                                 
i: 2, j: -5                                                                                                                 
i: 3, j: -5                                                                                                                 
i: 4, j: -5  

Его простая математика. - (-) равно +. Итак - (j) = - (- 5) = 5.

0 голосов
/ 12 июля 2020

Пробел не определяет область действия в C#, поэтому ваш оператор компилируется.

for 
(
            int 
i
=
        0; 
i 
            <    -

             b
                                 ;
              i
                ++
)

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

0 голосов
/ 12 июля 2020

Он компилируется, потому что он синтаксически правильный. Это означает i < (b*-1).

...