使用一個簡單的計數程序來比較古老的C語言和現代的Go語言。Go是一種現代的編程語言,它在很大程度上源自C語言。因此,對于任何使用C語言編寫程序的人來說,Go可能會感覺很熟悉。Go使得編寫新程序變得容易,同時又讓C程序員感到熟悉,避免了C語言中的許多常見陷阱。本文比較了一個簡單的C語言和Go語言程序,用于將從1到10的數字相加。由于該程序僅使用小的數值,所以數字不會變得太大,只使用普通的整數變量即可。像這樣的循環在編程中非常常見,因此這個簡單的程序很容易比較C語言和Go語言。
如何在C語言中實現循環
在C語言中,基本的循環是for
循環,它允許你迭代遍歷一組值。for
循環的基本語法是:
for (起始條件; 結束條件; 每次迭代后的操作) {// 循環體內要執行的操作
}
你可以通過將起始條件設置為1,結束條件設置為count <= 10來編寫一個循環,以打印從1到10的數字。這樣可以將循環的變量count初始化為1,并且只要count小于或等于10,循環就會繼續執行。在每次迭代之后,你可以使用count = count + 1來遞增變量的值。在循環體內部,你可以使用printf來打印變量的值。
for (count = 1; count <= 10; count = count + 1) {printf("%d\n", count);
}
在C編程中,常見的約定是使用"++“表示"將某個值加一”。如果你寫成"count++“,那和"count = count + 1"是等價的。大多數C程序員會使用這種方式來編寫循環,使用”++count"作為每次迭代后的操作,就像這樣:
for (count = 1; count <= 10; count++) {printf("%d\n", count);
}
下面是一個示例程序,它將從1到10的數字相加,然后打印結果。使用循環來迭代數字,但是不打印數字,而是將數字加到一個變量中。
#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語言循環非常相似的循環結構。C程序中的for
循環可以直接翻譯為Go語言中具有類似表示的for
循環:
for count = 1; count <= 10; count++ {fmt.Printf("%d\n", count)
}
使用這個循環,你可以直接將示例程序翻譯為Go語言:
package main
import "fmt"
?
func main() {var sum, count intfmt.Println("adding 1 to 10 ..")
?for count = 1; count <= 10; count++ {sum = sum + count}fmt.Printf("The sum is %d\n", sum)
}
雖然上述代碼是有效且正確的Go代碼,但它并不是最符合Go語言習慣的寫法。在Go語言中,習慣使用對本地語言使用者來說更自然的表達方式。任何語言的目標都是有效的溝通,這也包括編程語言。在不同編程語言之間進行轉換時,重要的是要認識到,盡管外觀上相似,但一個編程語言中的典型寫法在另一個編程語言中可能并非完全相同。?為了使用更符合Go語言習慣的方式更新上述程序,你可以進行一些小的修改:
- 使用add-to-self操作符可以更簡潔地編寫為。C也可以使用這種風格。+=sum =sum + countsum += count
- 使用賦值-插入類型操作符來表示而不是跟在后面。該語法定義并初始化count變量。Count = 1var Count intcount = 1
- 將聲明移動到循環頭文件中。這減少了一些認知開銷,并通過減少程序員必須隨時考慮的變量數量來提高可讀性。通過在盡可能小的范圍內盡可能靠近變量的使用范圍聲明變量,這種更改還提高了安全性。這減少了代碼演化過程中意外操作的可能性
上述變化的綜合結果是:
package main
import "fmt"
?
func main() {fmt.Println("adding 1 to 10 ..")var sum intfor count := 1; count <= 10; count++ {sum += count}
?fmt.Printf("The sum is %d\n", sum)
}
C和Go很相似,但又有所不同
通過在兩種編程語言中編寫相同的程序,可以看出C語言和Go語言的相似之處,但也存在一些不同之處。在從C語言過渡到Go語言時,有幾個重要的注意事項:
-
在C語言中,每個編程指令都必須以分號結尾。這告訴編譯器一個語句的結束和下一個語句的開始。在Go語言中,分號是有效的,但幾乎總是可以推斷出來。
-
雖然大多數現代C編譯器會為您將變量初始化為零值,但C語言規范指出變量會獲得內存中的任意值。而在Go語言中,變量總是被初始化為它們的零值。這有助于使Go語言成為一種更安全的內存語言。這種區別在處理指針時變得更加有趣。
-
注意在導入標識符時使用Go語言的包限定符。例如,對于實現格式化輸入和輸出的函數,類似于C語言的
printf
和scanf
,可以使用fmt
包。該包在pkg.go.dev/fmt
中有文檔。 -
在Go語言中,
main
函數總是以退出碼0返回。如果你希望返回其他值,你必須調用os.Exit
函數,其中n
通常為1,表示錯誤。這個函數可以從任何地方調用,不僅僅是在main
函數中,用于終止程序。在C語言中,你可以使用exit
函數,定義在stdlib.h
中,通過調用exit(n)
來實現相同的功能。
在從C語言過渡到Go語言時,了解這些差異和注意事項是非常重要的。這樣可以幫助你更好地理解和適應Go語言的語法和特性,以便編寫出更優雅、更安全的Go代碼。
作者:Jim Hall
更多技術干貨請關注公眾號“云原生數據庫”
squids.cn,目前可體驗全網zui低價RDS,免費的遷移工具DBMotion、SQL開發工具等。