Сколько путей имеет вложенный оператор if?

У меня есть вопрос относительно этой метрики.

Например, если у меня есть следующий код, сколько путей имеет функция main?

void main()
{
    int i = 0, j = 0, k = 0;
    for (i=0; i<10; i++)
    {
        for (j=0; j<10; j++)
        {
            for (k=0; k<10; k++)
            {
                if (i < 2 )
                    printf("value is more than 2\n");
                if (i > 5)
                    printf("value is less than 5\n");
            }
        }
    }
}

Первые три цикла for должны иметь 3 пути и один дополнительный, который обходит все операторы потока управления, тогда как насчет вложенного оператора if? Это 1x1 = 1 путь?

Всем, у кого нет учетной записи Matlab, на сайте есть следующее описание:

A control flow statement introduces branches and adds to the original one path.

    if-else if-else: Each if keyword introduces a new branch. The contribution from an if-else if-else block is the number of branches plus one (the original path). If a catch-all else is present, all paths go through the block; otherwise, one path bypasses the block.

    For instance, a function with an if (..) {} else if (..) {} else {} statement has three paths. A function with one if () {} only has two paths, one that goes through the if block and one that bypasses the block.

for and while: Each loop statement introduces a new branch. The contribution from a loop is two - a path that goes through the loop and a path that bypasses the loop.
If more than one control flow statement are present in a sequence without any nesting, the number of paths is the product of the contributions from each control flow statement.

For instance, if a function has three for loops and two if-else blocks, one after another, the number of paths is 2 × 2 × 2 × 2 × 2 = 32.

void func()
{
    int i = 0, j = 0, k = 0;
    for (i=0; i<10; i++)
    {
        for (j=0; j<10; j++)
        {
            for (k=0; k<10; k++)
            {
                if (i < 2 )
                    ;
                else
                {
                    if (i > 5)
                        ;
                    else
                        ;
                }
            }
        }
    }
}

In this example, func has six paths: three from the for statements, two from the if statements plus the original path that bypasses all control flow statements.

ваша метрическая ссылка ведет на страницу входа в Matlab.

Mairon 21.11.2022 13:15

@Mairon о да, нам нужна учетная запись, чтобы увидеть сайт. Загружать фото с сайта или что делать?

naomikim 21.11.2022 13:17

@naomikim Скопируйте и вставьте вопрос сюда как текст. Изображения не рекомендуются.

Rohan Bari 21.11.2022 13:18

3 пути... а) вывести "значение больше 2" или б) вывести "значение меньше 5" или в) ничего не делать. Кстати: обратите внимание, как напечатанный тест противоречит условию в операторе if... хм...

Support Ukraine 21.11.2022 13:22

пожалуйста, смотрите описание, которое я только что отредактировал. Спасибо

naomikim 21.11.2022 13:28

Если я что-то не так понял, это не вложенный if, а всего 2 отдельных?

voidops.com 21.11.2022 13:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно описанию:

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

и

Вклад блока if-else — это количество ветвей плюс один (исходный путь).

ваши два оператора if вносят по 2 пути каждый, так что 2 x 2 = 4 пути, а затем каждый из ваших циклов добавляет один дополнительный путь, поэтому всего будет 7 путей.

Однако это описание не имеет для меня особого смысла, так как этот код имеет только один возможный путь:

if (true) {
    // this part is always executed
}

Это может показаться очевидным, но более сложные ситуации могут легко уменьшить количество возможных путей, как в вашем примере, где есть только три возможности: либо i < 2, либо i > 5, либо i >= 2 && i <= 5.

Я полагаю, что описание метрики имело бы смысл как верхняя граница количества путей.

«... является результатом вклада каждого оператора потока управления» и «ваши два оператора if вносят по 2 пути каждый, так что 2 x 2 = 4 пути» хм... Я не думаю, что это правильно здесь. Два оператора if не являются независимыми, поэтому не может быть 4 путей. В этом случае никогда не может быть ситуации, когда оба if-условия истинны.

Support Ukraine 21.11.2022 13:48

@SupportUkraine Я не вижу в описании упоминания о независимости. Я следую за этим к письму. Однако я объясняю, как это не совсем правильно сразу после этого предложения.

Nelfeal 21.11.2022 13:50

Другие вопросы по теме