# Solidity语言的小分享（1）

By [xc520](https://paragraph.com/@chengxxx) · 2022-07-19

---

大框架以及很多归纳内容来自：

[https://github.com/AmazingAng/WTFSolidity](https://github.com/AmazingAng/WTFSolidity)

基础篇
---

### 语言就是语法加词汇！

和其他语言如中文一样，也是语法加词汇：

我 吃 饭

我 吃（很好吃的）饭

我（快速地）吃（很好吃的）饭

### 一些写在最前面的话

没啥意义第一个是版权啥的，第二个是兼容。

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.8.4;
    

### 合约开始

合约都在扩号内，每句加 `；`。

    contract HelloWeb3{
    ..bulabula..；
    ..bulabula..;
    }
    

### 语法

大体会是：变量类型 + 地点 + 名称 + 内容

根据不同的变量类型，细节微调。

例子：hello world

    string（变量类型）public（地点）asd（名字）= "hello world"（内容）;
    

### 变量类型

1.  **数值类型(Value Type)**：简单来说就是不可变的，包括布尔型，整数型等等，这类变量赋值时候直接传递数值。
    
2.  **函数类型(Function Type)**：`Solidity`文档里把函数归到数值类型，但我觉得他跟其他类型差别很大，所以单独分一类。
    
3.  **引用类型(Reference Type)**：包括数组和结构体，这类变量占空间大，赋值时候直接传递地址（类似指针）。
    
4.  **映射类型(Mapping Type)**: `Solidity`里的哈希表。
    

变量语法
----

### 数值

语法：数值类型 + 地点 + 名称 + 内容

词汇如下：

**布尔型（bool）**

运算符：

*   ! （逻辑非）
    
*   && （逻辑与， "and" ）
    
*   || （逻辑或， "or" ）
    
*   \== （等于）
    
*   != （不等于）
    
*   比较运算符： `<=`， `<`， `==`， `!=`， `>=`， `>`
    

    真
    bool（类型） public（地点） zhende（名字） = true;
    
    假
    bool private jiade = !zhende;
    
    或
    bool public zhenjia = zhende && jiade; 
    
    比大小
    bool public _numberbool = _number2 > _number3;
    

**整数**

int 整数、uint 正整数、uint256 256位正整数

运算符： `+`， `-`， 一元运算 `-`， `+`， `*`， `/`， `%`（取余），`**`（幂）

    定义一个数字
    uint256 public _number = 123;
    
    加法
    uint256 public _number1 = _number + 1;
    
    幂
    uint256 public _number2 = _number1**2; 
    
    余数
    uint256 public _number3 = _number2 % 2; 
    

**地址**

地址类型(address)存储一个 20 字节的值（以太坊地址的大小）。地址类型也有成员变量，并作为所有合约的基础。有普通的地址和可以转账`ETH`的地址（`payable`）。`payable`的地址拥有`balance`和`tranfer()`两个成员，方便查询`ETH`余额以及转账。

    地址
    address public _address = 0x7A58c0Be72BE218B41C608b7Fe7C5bB630736C71;
    
    让地址成为Payable类
    address payable public _address1 = payable(_address); 
    
    payable的地址类型可以查余额
    uint256 public balance = _address1.balance; 
    

**字节**

字节数组`bytes`分两种，一种定长（`byte`, `bytes8`, `bytes32`），另一种不定长。定长的属于数值类型，不定长的是引用类型（之后讲）。 定长`bytes`可以存一些数据，消耗`gas`比较少。

    固定长度的字节数组
    bytes32 public _byte32 = "CoinEx"; 
    bytes1 public _byte = _byte32[0]; 
    

`CoinEx`变量以字节的方式存储进变量`_byte32`

`_byte`变量存储`_byte32`的第一个字节

[https://blog.51cto.com/u\_15057858/4390670](https://blog.51cto.com/u_15057858/4390670)

---

*Originally published on [xc520](https://paragraph.com/@chengxxx/solidity-1)*
