aboutsummaryrefslogtreecommitdiffstats
path: root/docs/control-structures.rst
diff options
context:
space:
mode:
Diffstat (limited to 'docs/control-structures.rst')
-rw-r--r--docs/control-structures.rst63
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 |
+-----------------------+------+---------------------------------------------------------------+