Максимально допустимое количество вложенных условий - PullRequest
1 голос
/ 06 января 2011

Кто-нибудь знает лимит вложенных условий (я имею в виду условия под другим, несколько раз)?В, скажем, Java и Visual Basic.

Я вспомнил, когда я начинал с моей трассировки разработки, я делаю, я думаю, 3 вложенных условия в VB 6, и компилятор просто не вошел в третьеВо-первых, теперь, когда я помню, я никогда не знал максимальных вложенных кодировок, которые может принять язык.

Ответы [ 6 ]

4 голосов
/ 06 января 2011

Не должно быть ограничений для РЕАЛЬНОГО языка программирования. Для VB.NET и Java я был бы шокирован, если есть какие-либо ограничения. Предел НЕ будет памятью, потому что мы говорим об ограничениях COMPILE TIME, а не об ограничениях среды.

Это работает только в C #: следует отметить, что компилятор может оптимизировать это, чтобы даже не использовать IF.

static void Main(string[] args)
{
    if (true)
    {
        if (true)
        {
            if (true)
            {
                if (true)
                {
                    if (true)
                    {
                        if (true)
                        {
                            if (true)
                            {
                                if (true)
                                {
                                    if (true)
                                    {
                                        if (true)
                                        {
                                            if (true)
                                            {
                                                if (true)
                                                {
                                                    if (true)
                                                    {
                                                        if (true)
                                                        { Console.WriteLine("It works"); }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Это не должно быть слишком оптимизировано:

static void Main(string[] args)
{
    if (DateTime.Now.Month == 1)
    {
        if (DateTime.Now.Year == 2011)
        {
            if (DateTime.Now.Month == 1)
            {
                if (DateTime.Now.Year == 2011)
                {
                    if (DateTime.Now.Month == 1)
                    {
                        if (DateTime.Now.Year == 2011)
                        {
                            if (DateTime.Now.Month == 1)
                            {
                                if (DateTime.Now.Year == 2011)
                                {
                                    if (DateTime.Now.Month == 1)
                                    {
                                        if (DateTime.Now.Year == 2011)
                                        {
                                            if (DateTime.Now.Month == 1)
                                            {
                                                if (DateTime.Now.Year == 2011)
                                                {
                                                    if (DateTime.Now.Month == 1)
                                                    {
                                                        if (DateTime.Now.Year == 2011)
                                                        { Console.WriteLine("It works"); }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    Console.ReadKey();
}
2 голосов
/ 06 января 2011

Я согласен с большинством людей здесь, что нет ограничений на написание блоков if. Но существует максимальный предел размера метода java. Я считаю, что его 64K.

1 голос
/ 06 января 2011

Если вы имеете в виду вложенные блоки if, то теоретического ограничения нет. Единственным ограничением является доступное дисковое пространство для хранения исходного кода и / или скомпилированного кода. Может также быть ограничение времени выполнения, если каждый блок генерирует новый кадр стека, но опять же, это просто ограничение памяти.

Единственным объяснением вашего эмпирического результата 3 является либо ошибка в программировании, либо ошибка в интерпретации результатов.

0 голосов
/ 06 января 2011

Ограничение на количество вложенных условных выражений почти наверняка будет зависеть от размера стека компилятора и структур данных, а не от того, что связано со средой выполнения, за исключением, возможно, случаев, когда пространство кода целевой средыстрого ограничен по отношению к памяти, доступной компилятору (например, с использованием современного ПК для компиляции программы для небольшого микроконтроллера с 512 байтами флэш-памяти).Обратите внимание, что для оценки глубоко вложенной комбинации логических операторов во время выполнения не требуется оперативной памяти (кроме той, которая используется для хранения самого кода), кроме той, которая требуется для наиболее сложного термина (т. Е. Памяти, необходимой для вычисления).(foo () || bar ()) && boz () '- это наибольший объем памяти, необходимой для вычисления foo (), bar () или boz ()).

На практике этоНи в коем случае нельзя было бы достичь предела, используя современный компилятор на современной машине, если только вы не пишете «программу» для конкретной цели ее превышения (я ожидаю, что предел будет, вероятно, между 1000 и 1 000 000 уровней вложенности, нодаже если это «только» 1000, нет смысла вкладывать вещи так глубоко).

0 голосов
/ 06 января 2011

Я должен согласиться, что ограничение основано исключительно на ограничении памяти.Если бы вы его достигли, я бы ожидал, что вы достигнете какого-то предела переполнения стека, однако я сомневаюсь, что есть вероятность, что вы достигнете этого предела.вверх, но быстрый тест из 40+ вложенных, если операторы скомпилированы и работают нормально.

0 голосов
/ 06 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...