본문 바로가기
전공공부/블록체인공학

Solidity 조건문과 반복문

by 으노으뇨 2021. 11. 29.
728x90
반응형
SMALL

1.조건문

  • if ~ else
  • if ~ else if ~ ... else 
  • ..? ..: ..; (삼항 연산)
  • switch ~ case 사용 불가
switch/case 나 goto 문은 지원하지 않는다.
자동 형변환 (type conversion)도 지원하지 않는다 :
ex) if(true){...} (0)
if(1){...} (x)

2. 반복문

  • for(초기치 ; 조건 ; 증감치) { statement ; ... }
  • while(조건) {statement ; ... }
  • do { statement ; ... } while(조건);
반복문의 제어
  • continue : 만약 이 문법을 만나면 아래코드로 진행하지않고 다시 반복문 처음으로 돌아가라 라는 뜻이다.
  • break : 조건에 의해 브레이크를 만나면 반복문을 탈출하게 된다.

해보기

//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract ForAndIf {

    function Test() public pure returns (uint) {
        uint sum = 0 ;
        for (uint i = 0 ; i <= 100 ;i++) {
            if (i % 7 == 0)
                continue;

            sum = sum+i;
        }
        return sum;
    }
}

7의 배수일경우 컨티뉴를 해서 더하지않고 다시 반복문을 돌리는 즉, 7의 배수만 제외한 100까지의 모든수를

더하는 함수이다.

값은 4315로 나왔다.

이것은 반복문안에 조건문을 걸어 해당 조건절이 참이되면 컨티뉴를 통해 제어를 하는 함수이다.


//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.10;

contract Ifelse {

    function Test(uint a) public pure returns(bool) {
        if (a % 2 == 0) {
            return true;
        } else {
            return false;
        }
    }
}

If else 문의 예시이다.

숫자를 받아 만약 해당 값이 2의 배수 , 짝수이면 트루를 아니면 거짓을 반환하도록 하였다.

컴파일해주고 디플로이해준뒤 확인해보자

3을 넣어주니 거짓이 나왔다.

4를 넣어주니 참을 반환받았다.


        function Test3(uint a, uint b) public pure returns(bool) {
        if (a / b >= 1) {
            return true;
        }
        else{
            return false;
        }
    }

추가적으로 값을 하나더 받아서 둘을 나누고 그것이 1보다 큰지 작은지를 구하는 함수를 만들었다.

이때 uint 특성상 100/99 는 1보다 크다. 그래서 true를 나타낸다. 계산기를 보니 1.010101로 나온다.

그런데!!! a/b>=1 이 아닌 a/b>1 로 등호를 빼면

false가 나온다. 아마도 100/99 를 1로 인식하고 나머지 소숫점을 절삭하여 인식해서 그런것같다.

 

728x90
반응형
LIST