Skip to content

Latest commit

 

History

History
228 lines (188 loc) · 8.93 KB

ch-05-controlling-execution-flow.md

File metadata and controls

228 lines (188 loc) · 8.93 KB

Выражение if

Синтаксическая конструкция if служит для логической проверки и выполнения блока кода при определённом условии. В языке Rust в этой конструкции постарались исключить многие потенциальные явные и скрытые ошибки.

fn main() {
    if 2 + 2 == 4 {
        println!("{}", 4);
    }
    if 2 + 2 != 5 {
        println!("{}", 5);
    }
    if '2' > '1' {
        println!("{}", 2);
    }
    if true {
        println!("{}", true);
    }
    if false {
        println!("{}", false);
    }
}

Rust Playground

Обратите внимание, что условное выражение не заключается в скобки, а фигурные скобки обязательные. Пожалуйста проверьте эти слова, написав проверочные программы, в результате работы которые будут получены сообщения об ошибках синтаксиса конструкции if.

Домашнее задание

Используя синтаксическую конструкцию if true {} создайте условия для ошибки - переполнения стека (thread 'main' has overflowed its stack fatal runtime error: stack overflow). Вариант правильного ответа (не подглядывайте! - напишите свой) Rust Playground

Выражение if else else if

Условные выражения могут описывать различные условия и быть вложенными. Хороший стиль программирования, а также технические ограничения и здравый смысл - всё это рекомендует делать эти конструкции как можно компактнее и проще.

fn main() {
     let n = 0;
    // let n = 1;
    // let n = 10 * 1000;
    // let n = -1;
    if n > 5000 {
        print!("Это число большое");
    } else if n > 0 {
        print!("А это числон небольшое");
    } else if n < 0 {
        print!("А это число отрицательное");
    } else {
        print!("А это ноль.");
    }
}

Rust Playground

Условная инициализация переменной

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

fn main() {
    {
        let a;
        if 2 + 2 == 4 {
            let b = 2 + 2 + 2;
            a = b;
        } else {
            let b = 20 + 20 + 20;
            a = b;
        }
        println!("{}", a);
    }
    {
        let a = if 2 + 2 == 4 {
            let b = 2 + 2 + 2;
            b
        } else {
            let b = 20 + 20 + 20;
            b
        };
        println!("{}", a);
    }
}

Rust Playground

Цикл while

В языке Rust существует цикл с предусловием while. Благодаря ему можно многократно выполнять содержание блока кода.

fn main() {
    let mut j = 0;
    while j <= 256 {
        print!("{} ", j * j);
        j += 1;
    }
}

Rust Playground

Домашнее задание.

Попробуйте произвести инициализацию переменной с помощью цикла while. Какой результат у вас получится? Если у вас появятся вопросы без ответа - это хорошо. На последующих занятиях мы найдем на них ответы.

Пример решения. Rust Playground

Прерывание цикла. break. continue.

Для прекращения работы цикла используется ключевое слово break. Для перехода на новую итерацию цикла до завершения работы всего блока кода цикла используется continue.

break

Пример:

fn main() {
    let mut j = 0;
    while j < 256 {
        let k = j * j;
        j += 1;
        print!("{} ", k);
        if k >= 40000 {
            break;
        }
    }
}

Rust Playground

continue

Пример:

fn main() {
    let mut j = 0; 
    while j <= 256 { 
        j += 1; 
        if j % 2 == 0 { 
            continue; 
        } 
        print!("{} ", j * j); 
    }
}

Rust Playground

Бесконечный цикл loop

loop продолжает список языковых конструкций для организации циклов. Можно сказать, что loop - это сокращенная запись while true, так как они эквивалентны по принципу своей работы. Приме использования:

fn main() {
    let mut j = 0;
    loop {
        print!("{} ", j * j);
        j += 1;
        if j == 200 {
            break;
        } else if j == 255 {
            continue;
        }
    }
}

Rust Playground

Цикл for

Цикл for в Rust имеет свои самобытные особенности. Поэтому не его синтаксе надо остановиться подробнее. Пример использования:

fn main() {
    for i in 1..11 {
        print!("{} ", i );
    }
    
}

Rust Playground

Обратим внимание на строку for i in 1..11 {. В ней i инициализируется непосредственно на месте. Также мы видим конструкцию 1..11. Это описание числовой последовательности, в которой первый элемент является 1, а последний это число, которое является последним. Как только значение цикла дошло до этого последнего числа - цикл прекращает свою работу. Инициируемые переменные внутри цикла, прекращают существование.

fn main() {
    let mut j = 0;
    for i in 1..11 {
        print!("{} ", i );
        j = i;
    }
    println!();
    println!("{}", j);
    // println!("{}", i);
}

Rust Playground

Важной особенностью цикла for является возможность инициализации отрезка чисел с помощью переменных:

fn main() {
    let mut j = 0;
    let start = 0;
    let limit = 11;
    for i in start..limit {
        print!("{} ", i);
        j = i;
    }
    println!();
    println!("{}", j);
}

Rust Playground

Домашнее задание

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