文章目录
表达式与控制结构
控制结构
Solidity 提供了大多数在使用大括号的语言中常见的控制结构,包括:if、else、while、do、for、break、continue、return,其语义与 C 或 JavaScript 中的语义相同。
Solidity 还支持异常处理形式的 try/catch 语句,但仅适用于外部函数调用和合约创建调用;还可以使用 revert 语句创建错误。
条件语句中的括号不能省略,但单条语句体周围的大括号可以省略。
注意:Solidity 中没有像 C 和 JavaScript 那样从非布尔类型到布尔类型的类型转换,因此 if (1) { … } 在 Solidity 中是无效的。
函数调用
内部函数调用
当前合约的函数可以直接(“内部地”)调用,也可以递归调用,如下面这个没有意义的例子所示:
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.22 <0.9.0;
// 这将触发一个警告
contract C {
function g(uint a) public pure returns (uint ret) { return a + f(); }
function f() internal pure returns (uint ret) { return g(7) + f(); }
}
这些函数调用在 EVM 中会被转换为简单的跳转。这意味着当前的内存不会被清除,即向内部调用的函数传递内存引用非常高效。
注意:只有同一个合约实例的函数可以进行内部调用;我们应避免过度使用递归,因为每一次内部函数调用至少会占用一个堆栈槽位,而总共只有 1024 个可用槽位。
外部函数调用
函数也可以使用 this.g(8);
和 c.g(2);
的方式进行调用,其中 c
是一个合约实例,g
是属于 c
的一个函数。通过这两种方式调用函数 g
都会被视为“外部”调用,使用消息调用(message