while loop - demonoved/A-trial-run-in-solidity GitHub Wiki

// SPDX-License-Identifier: MIT
// compiler version must be greater than or equal to 0.8.20 and less than 0.9.0
pragma solidity ^0.8.23;
contract Loop {
    function loop() public {
        // цикл for
        for (uint i = 0; i < 10; i++) {
            if (i == 3) {
                //переход к следующей интерации через continue
                continue;
            }
            if (i == 5) {
                //выход из цикла через break
                break;
            }
        }
        //цикл while
        uint j;
        while (j < 10) {
            j++ ;
        }
    }
    
}
contract Loop {

Определение начала нового смарт контракта с именем Loop.

    function loop() public {

Объявление функции loop, которая отмечена как public, что означает, что эта функция будет доступна для вызова извне контракта.

        // цикл for
        for (uint i = 0; i < 10; i++) {

Запуск цикла for, который инициализирует переменную счетчика i значением 0. Цикл будет выполняться, пока i меньше 10, и после каждой итерации значение i увеличивается на 1 (i++).

            if (i == 3) {
                //переход к следующей интерации через continue
                continue;
            }

Если переменная i равна 3, то оператор continue будет вызван. Это приведет к пропуску оставшейся части текущей итерации цикла и немедленному переходу к следующей итерации цикла.

            if (i == 5) {
                //выход из цикла через break
                break;
            }

Если переменная i равна 5, то оператор break будет вызван. Это приведет к тому, что выполнение цикла немедленно прекратится, и компилятор перейдет к выполнению кода, следующего за циклом for.

Итерации цикла for проходят следующим образом:

  • i = 0: итерация выполняется,
  • i = 1: итерация выполняется,
  • i = 2: итерация выполняется,
  • i = 3: цикл пропускает остальную часть этих операций и переходит к увеличению i до 4,
  • i = 4: итерация выполняется,
  • i = 5: break вызывается, и цикл завершается.
        //цикл while
        uint j;
        while (j < 10) {
            j++;

Это объявление цикла while, который не закончит свое выполнение, пока j не достигнет 10. Переменная j объявляется вне цикла и инициализируется как 0 (по умолчанию для uint в Solidity). В блоке цикла j увеличивается на 1 на каждой итерации.

        }
    }

Это окончание функции loop и окончание контракта Loop.

Применимость

Такой код, возможно, был написан с целью обучения или в качестве примера для демонстрации работы циклов в Solidity. В реальных смарт-контрактах, использующих циклы, очень важно учитывать стоимость газа и предотвращать возможность "out of gas" исключений (когда транзакция прерывается из-за того, что заданный лимит газа был исчерпан). В случае выполнения большого количества итераций или неопределенности в количестве итераций следует с особым вниманием оценивать возможные риски и затраты.