Conditional Statements in Yul

Shlok KumarShlok Kumar
4 min read

Yul is an intermediate language that can be compiled to bytecode for different backends, such as the Ethereum Virtual Machine (EVM) or the eWASM virtual machine. It can be used in stand-alone mode or for "inline assembly" inside Solidity contracts. Yul is designed to be simple, functional and low-level, allowing developers to get closer to the raw machine code and optimize their smart contracts for gas efficiency.

Conditional statements are useful for implementing logic that depends on some condition or value. Conditional statements are an essential part of programming languages, and Yul is no exception. Yul is a low-level intermediate language used in the Ethereum Virtual Machine (EVM). It is designed to be simple, efficient, and easy to optimize. Conditional statements are used to execute a block of code based on a condition. In Yul, there are two types of conditional statements: if-else statements and switch statements.

The if statement

The if statement is the most basic form of conditional statement in Yul. It has the following syntax:

if <condition> {
    <trueBody>
}

The <condition> is an expression that evaluates to a single value of type u256, which is the native 256-bit type of the EVM. The <trueBody> is a block of statements that are executed if and only if the <condition> evaluates to a non-zero value. If the <condition> evaluates to zero, the <trueBody> is skipped and the execution continues with the next statement after the if statement.

For example, suppose we want to write a function that checks if a given number is even or odd. We can use an if statement to test if the least significant bit of the number is zero or one:

function isEven(x) -> result {
    if and(x, 1) {
        // x is odd
        result := 0
    }
    {
        // x is even
        result := 1
    }
}

The and function performs a bitwise AND operation on its two arguments and returns the result. If x is odd, then and(x, 1) will return 1, otherwise it will return 0. The result := <value> statement assigns a value to the output variable result, which is declared after the arrow (->) in the function signature.

Note that we do not need an else clause for the if statement, because we can use a separate block of statements that are executed regardless of the condition. This is equivalent to writing:

function isEven(x) -> result {
    if and(x, 1) {
        // x is odd
        result := 0
    } else {
        // x is even
        result := 1
    }
}

However, using a separate block can save some gas by avoiding an unnecessary jump instruction.

The switch statement

The switch statement is another form of conditional statement in Yul. It has the following syntax:

switch <expression>
case <value_1> {
    <body_1>
}
case <value_2> {
    <body_2>
}
...
default {
    <defaultBody>
}

The <expression> is an expression that evaluates to a single value of type u256. The <value_i> are constant values that are compared with the <expression>. The <body_i> are blocks of statements that are executed if and only if the <expression> matches the corresponding <value_i>. The <defaultBody> is a block of statements that are executed if none of the <value_i> match the <expression>. The default clause is optional, but it is recommended to always include it to handle unexpected cases.

For example, suppose we want to write a function that returns the factorial of a given number. We can use a switch statement to handle different cases based on the input value:

function factorial(x) -> result {
    switch x
    case 0 {
        // 0! = 1
        result := 1
    }
    case 1 {
        // 1! = 1
        result := 1
    }
    default {
        // x! = x * (x - 1)!
        let y := sub(x, 1)
        let z := factorial(y)
        result := mul(x, z)

Conclusion

Conditional statements are an essential part of programming, and Yul provides a simple and efficient way to use them. By using if-else and switch statements, you can execute code based on conditions and create more complex programs.

When using conditional statements in Yul, there are some common mistakes that you should avoid. One common mistake is to use an assignment operator instead of a comparison operator in the condition. This can be avoided by always placing the constant on the left-hand side of the operator. Another mistake is to forget to include a default case in a switch statement. This can lead to unexpected behavior if the value of the variable does not match any of the cases.

Additionally, it is important to be aware of the order of operations when using logical operators such as "and" and "or". Parentheses can be used to force expressions to evaluate in the intended order. Finally, it is important to test your code thoroughly to catch any bugs or unexpected behavior.

For more content, follow me at - https://linktr.ee/shlokkumar2303

0
Subscribe to my newsletter

Read articles from Shlok Kumar directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Shlok Kumar
Shlok Kumar

Ethereum developer Solidity smart contract expert Bitcoin and cryptocurrency enthusiast Experience in Solana and other blockchain platform Blockchain enthusiast and developer. Building decentralized solutions that shape the future. Passionate about smart contracts, dApps, and all things crypto. Follow me for updates on my projects and the latest in blockchain technology.