diff options
Diffstat (limited to 'docs/control-structures.rst')
-rw-r--r-- | docs/control-structures.rst | 63 |
1 files changed, 60 insertions, 3 deletions
diff --git a/docs/control-structures.rst b/docs/control-structures.rst index 9ce746ef..1bb0f71a 100644 --- a/docs/control-structures.rst +++ b/docs/control-structures.rst @@ -142,6 +142,63 @@ Assigning *to* a state variable always creates an independent copy. On the other .. index:: ! exception, ! throw +Scoping and Declarations +======================== + +.. index:: ! scoping, ! declarations + +In Solidity, a variable declared anywhere within a function will be in scope for the *entire function*, regardless of where it is declared. +This happens because Solidity inherits its scoping rules from JavaScript. +This is in contrast to many languages where variables are only scoped where they are declared until the end of the semantic block. +As a result, the following code is illegal and cause the compiler to throw an error, `Identifier already declared`:: + + contract ScopingErrors { + function scoping() { + uint i = 0; + + while (i++ < 1) { + uint same1 = 0; + } + + while (i++ < 2) { + uint same1 = 0;// Illegal, second declaration of same1 + } + } + + function minimalScoping() { + { + uint same2 = 0; + } + + { + uint same2 = 0;// Illegal, second declaration of same2 + } + } + + function forLoopScoping() { + for (uint same3 = 0; same3 < 1; same3++) { + } + + for (uint same3 = 0; same3 < 1; same3++) {// Illegal, second declaration of same3 + } + } + } + +In addition to this, if a variable is declared, it will be initialized at the beginning of the function to its default value. +As a result, the following code is legal, despite being poorly written:: + + function foo() returns (uint) { + // baz is implicitly initialized as 0 + uint bar = 5; + if (true) { + bar += baz; + } + else { + uint baz = 10;// never executes + } + return bar;// returns 5 + } + Exceptions ========== @@ -208,7 +265,7 @@ idea is that assembly libraries will be used to enhance the language in such way // by using o_code = new bytes(size) o_code := mload(0x40) // new "memory end" including padding - mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), bnot(0x1f)))) + mstore(0x40, add(o_code, and(add(add(size, 0x20), 0x1f), not(0x1f)))) // store length in memory mstore(o_code, size) // actually retrieve the code, this needs assembly @@ -292,7 +349,7 @@ The opcodes `pushi` and `jumpdest` cannot be used directly. +-----------------------+------+---------------------------------------------------------------+ | exp(x, y) | | x to the power of y | +-----------------------+------+---------------------------------------------------------------+ -| bnot(x) | | ~x, every bit of x is negated | +| not(x) | | ~x, every bit of x is negated | +-----------------------+------+---------------------------------------------------------------+ | lt(x, y) | | 1 if x < y, 0 otherwise | +-----------------------+------+---------------------------------------------------------------+ @@ -304,7 +361,7 @@ The opcodes `pushi` and `jumpdest` cannot be used directly. +-----------------------+------+---------------------------------------------------------------+ | eq(x, y) | | 1 if x == y, 0 otherwise | +-----------------------+------+---------------------------------------------------------------+ -| not(x) | | 1 if x == 0, 0 otherwise | +| iszero(x) | | 1 if x == 0, 0 otherwise | +-----------------------+------+---------------------------------------------------------------+ | and(x, y) | | bitwise and of x and y | +-----------------------+------+---------------------------------------------------------------+ |