Solidity

當我將 5/2 與使 用賦值運算符一起放置時,為什麼沒有出現除法錯誤

  • December 7, 2021

我剛剛發現,當我用賦值運算符做 5/2 時,它不會立即給出任何錯誤,只是將結果給出為 2 而不是 2.5。你能告訴我為什麼會這樣嗎?

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 < 0.9.0;

contract Practice {
  uint a = 5;
  function assignment() public returns(uint){
   a /= 2 // no error 
   return(a) // it returns 2 instead of 2  
  }
}
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 < 0.9.0;

contract Practice {
  uint public a = 5/2; // error occured
}

還有一個問題,當我將變數聲明為 public 時,它會是私有的嗎?

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 < 0.9.0;

contract Practice {
  uint a; // Does it become private?
}

情況1:

你只是在這裡做一個整數除法,因為solidity不能做任何其他事情……所以5/2 = 2。真正的結果是2.5是的,但是如果你只處理整數,你會刮掉小數部分,結果是2.

案例二:

uint public a = 5/2; // error occured

這失敗了,因為 5/2 在編譯時被評估。編譯器程式碼可以將其評估為有理數(2.5),但會拋出錯誤,因為 1)solidity 僅處理整數和 2)即使它可以將其轉換為整數(2)並編譯它,這將是一個糟糕的主意因為它允許編譯器默默地更改與您編寫的內容不同的值。在這裡拋出錯誤要好得多。

最後 :

當我將變數聲明為 public 時,它會是私有的嗎?

文件中:

內部的

這些函式和狀態變數只能在內部訪問(即從目前合約或從它派生的合約中),而不使用 this。這是狀態變數的預設可見性級別。

因此,不,它們預設情況下不是公開的,而是內部的。與 private 的唯一區別是 internal 允許派生合約訪問該變數,而 private 則不允許。

引用自:https://ethereum.stackexchange.com/questions/115106