籠統的資料處理

NAGISB發表於2024-12-05

通常來說,根據資料型別可以將程式語言分為兩類:

強型別語言

  • 強型別語言(Strongly typed language)不僅強制要求事先宣告變數,還要求宣告每個變數的資料型別,這樣編譯器就能準確地知道這個變數中的值的型別。強型別語言在資料型別上要求很嚴格:必須事先說明變數中存放的資料的型別,而在程式的程式碼中不將其他型別的資料存放到變數中。若將某個變數宣告為數字,那麼編輯器就認為存放的是一個數字;若違反了這個規定 ,比如將日期存放在這個變數中,比那機器就會報錯。

弱型別語言

  • 在弱型別語言(loosely typed language)中,無需事先宣告變數的資料型別。但存放在變數的資料型別依然是個需要注意的問題(不能要求計算機2 + banana),但弱資料型別不會在這個問題上斤斤計較。通常,在弱型別語言中都無法宣告資料型別,而強型別語言則強制要求宣告每個變數的資料型別

編譯型語言

  • 編譯型語言通常都是強型別的,但也確實存在介於兩者之間的語言。用編譯型語言編寫的程式碼預先由編譯器處理,生成一個經過最佳化的二進位制可執行檔案————例如EXE檔案。指令碼語言事先不會被編譯,而是在執行時編譯。

編譯型語言流程

  1. 在普通文字中編寫程式碼
  2. 將程式碼編譯成可執行檔案
  3. 執行編譯好的可執行檔案
  4. 程式執行

指令碼型語言

  • 指令碼語言通常都是弱型別的, 其中執行時引擎(runtime engine)會在執行時解釋程式碼,而不是事先編譯

指令碼型語言流程

  1. 在普通文字中編寫程式碼
  2. 執行指令碼檔案
  3. 指令碼執行時引擎在程式執行時編譯程式碼
  4. 程式執行

由於程式碼實在程式執行時才編譯,所以編譯器會檢查變數存放的資料和操作合理的猜測其資料型別(2 + banana),進行隱式轉換

因此準尋變數用途唯一原則,避免隱式轉換

Dim strFirst,lngSecond

strFirst=CStr(50)
lngSecond=CLng(100)
result=strFirst+lngSecond
Msgbox result

' 兩個變數都是字串子型別,會將進行字串連線
' 其中有一個式數字子型別,隱式轉換Str->double
' MsgBox將內容轉為字串輸出或解析變數result
' 其中的字串子型別不含有數字,相加會產生"Type Mismatch"錯誤.
#! /bin/bash

strFirst="50"
IntSecond=100
result=$[$strFirst + $IntSecond]
echo $result
echo "$result"

# result接受到隱式轉換的str->int
# echo 前者輸出 變數 $result 的值 後者輸出 帶引號的變數 $result 的值

strFirst="50"
IntSecond="100"
result=strFirst.to_i+IntSecond.to_i
puts result 
puts "#{result}"

# 其中有一個式數字子型別,無法進行隱式轉換否則會觸發TypeError
# puts 前者輸出變數 result 的值 後者輸出帶引號的變數 result 的值

相關文章