編程語言比較:C 和 Go
Go 是一種現代編程語言,它很大程度上源自於 C 編程語言。因此,對於寫 C 程序的程序員來說,Go 應該會感覺很熟悉。Go 讓編寫新程序變得容易,同時讓 C 程序員感覺熟悉,但避免了 C 編程語言的許多常見陷阱。
本文比較了一個簡單的 C 和 Go 程序,該程序將數字從一相加到十。由於這個程序只使用了小的數值,所以結果不會變得太大,因此只使用了普通的整數變數。像這樣的循環在編程中非常常見,所以這個簡單的程序很容易比較 C 和 Go。
如何在 C 中執行循環
C 語言中最基本的循環是 for
循環,它允許你對一組值進行迭代。for
循環的基本語法是:
for (起始條件 ; 結束條件 ; 每次迭代後執行的操作) { 循環內要執行的內容 ; }
你可以編寫一個 for
循環,以列印從 1 到 10 的數字,將起始條件設置為 count = 1
,將結束條件設置為 count <= 10
。這樣就以 count
變數等於 1 時開始循環。結束條件意味著只要 count
變數小於或等於 10 ,循環就會繼續。
每次迭代之後,你使用 count = count + 1
將 count
變數的值增加 1。在循環內部,你可以使用 printf
列印 count
變數的值:
for (count = 1; count <= 10; count = count + 1) {
printf("%dn", count);
}
C 程序中常見的慣例是 ++
,它表示 「將某個值加一」。如果你寫 count++
,那就相當於 count = count + 1
。大多數 C 程序員會使用 count++
來編寫 for
循環中每次迭代後要執行的操作,像這樣:
for (count = 1; count <= 10; count++) {
printf("%dn", count);
}
這是一個示常式序,將從 1 到 10 的數字相加,然後列印結果。使用 for
循環對數字進行迭代,但不要列印數字,而是將數字添加到 sum
變數中:
#include <stdio.h>
int main() {
int sum;
int count;
puts("adding 1 to 10 ..");
sum = 0;
for (count = 1; count <= 10; count++) {
sum = sum + count;
}
這個程序使用了兩個不同的 C 函數來向用戶列印結果。puts
函數列印引號中的字元串。如果你需要列印純文本,使用 puts
是個不錯的選擇。
printf
函數 使用特殊字元在格式字元串中列印格式化的輸出。printf
函數可以列印許多不同種類的值。關鍵字 %d
列印十進位(整數)值。
如果你編譯並運行這個程序,你會看到這個輸出:
adding 1 to 10 ..
The sum is 55
如何在 Go 中執行循環
Go 提供了與 C 中非常相似的 for
循環。C 程序中的 for
循環可以直接轉換為 Go 的 for
循環,並具有相似的表示形式:
for count = 1; count <= 10; count++ {
fmt.Printf("%dn", count)
}
使用這個循環,你可以直接轉換為 Go 的示常式序:
package main
import "fmt"
func main() {
var sum, count int
fmt.Println("adding 1 to 10 ..")
for count = 1; count <= 10; count++ {
sum = sum + count
}
fmt.Printf("The sum is %dn", sum)
}
雖然上述方式在 Go 中是正確的,但它並不是最常用的 Go 寫法。採用慣例是「使用與本地語言為人所知的表達方式」。任何語言的目標都是高效的溝通,編程語言也不例外。在不同的編程語言之間進行轉換時,重要的是意識到儘管物似而意不同,一種編程語言中的典型寫法在另一種編程語言中可能不完全相同。
為使用更符合慣例的 Go,你可以進行幾個小修改:
- 通過使用
+=
操作符來將sum = sum + count
更簡潔地表達為sum += count
。 - 通過使用 分配並推斷類型運算符 來表達
count := 1
而不是var count int
跟著count = 1
。:=
語法同時定義並初始化count
變數。 - 將
count
的聲明移到for
循環的頭中。這減少了一些認知負擔,也通過減少程序員在任何時候都必須心裡記著的變數數目來提高可讀性。這個更改還通過在最接近其使用的地方和最小的範圍中聲明變數來增加安全性,從而減少了在代碼不斷演進的過程中對變數進行意外操作的可能性。
上述改動的組合將產生以下代碼:
package main
import "fmt"
func main() {
fmt.Println("adding 1 to 10 ..")
var sum int
for count := 1; count <= 10; count++ {
sum += count
}
fmt.Printf("The sum is %dn", sum)
}
你可以使用這個 Go.dev 的 鏈接 在 Go 試驗場中嘗試這個示常式序。
C 和 Go 相似但不同
通過在兩種編程語言中編寫相同的程序,你可以看到 C 和 Go 這兩種語言雖然相似但仍然不同。將從 C 轉換到 Go 時需要注意以下幾點:
- 在 C 中,每個程序指令都必須以分號結尾。這告訴編譯器一個語句在哪裡結束,下一個在哪裡開始。在 Go 中,分號是有效的,但幾乎總是可以推斷出來。
- 雖然大多數現代 C 編譯器會為你將變數初始化為零值,但 C 語言規範指出,變數得到的是內存中的任意值。Go 值總是初始化為其零值。這有助於使 Go 成為一種更具內存安全的語言。這種差異在使用指針時變得更加有趣。
- 注意 Go 程序包對導入標識符的使用方式。例如,
fmt
是一個實現格式化輸入和輸出的函數,類似於 C 中的stdio.h
中的printf
和scanf
。fmt
程序包在 pkg.go.dev/fmt 中有文檔描述。 - 在 Go 中,
main
函數總是以退出代碼 0 返回。如果你希望返回其他值,你必須調用os.Exit(n)
,其中n
通常為 1 以表示錯誤。這可以從任何地方調用,不僅僅是main
函數,來終止程序。你可以在 C 中使用在stdlib.h
中定義的exit(n)
函數來實現相同的效果。
(題圖:MJ/8f731484-2dc3-4bac-b895-cbc92a63b48b)
via: https://opensource.com/article/23/4/c-vs-go-programming-languages
作者:Jim Hall 選題:lkxed 譯者:ChatGPT 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive