最近,我一直在学习以太坊智能合约的开发。我有一个关于以下代码的问题;用a法得到的结果为4。这个结果和我的常识理解是一样的,因为在浮点处理中,运行时会截获相应的浮点数。然而,当我调用方法"b"时,结果是5。我不太理解这个结果。是因为编译器在编译过程中进行了优化,直接计算结果并存储它吗?非常感谢,伙计们。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract Test {
uint constant c = 5;
function a() public pure returns(uint){
return c/2 + c/2;
}
function b() public pure returns(uint){
return 5/2 + 5/2;
}
}
编译器似乎优化了return 5/2 + 5/2;
行。在汇编输出中,用solc-v0.8.13 --asm --optimize-run=100000
编译后,有以下几行:
/* "Test.sol":215:224 5/2 + 5/2 */
0x05
/* "Test.sol":208:224 return 5/2 + 5/2 */
swap1
pop
什么指示0x05
值是直接从函数调用返回的。
在函数a
中,整数除法向下取整,因此返回值为0x04
。编译器不会优化这一行,即使它对constant
和文字进行操作,并允许在EVM上运行整数除法。
值得一提的是,扎实是一种不断发展的语言。因此,未来的编译器版本可能会以这样一种方式优化代码,即本例中的函数将给出相同的结果。