比較編程語言C和Go

使用一個簡單的計數程序來比較古老的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語言時,有幾個重要的注意事項:

  1. 在C語言中,每個編程指令都必須以分號結尾。這告訴編譯器一個語句的結束和下一個語句的開始。在Go語言中,分號是有效的,但幾乎總是可以推斷出來。

  2. 雖然大多數現代C編譯器會為您將變量初始化為零值,但C語言規范指出變量會獲得內存中的任意值。而在Go語言中,變量總是被初始化為它們的零值。這有助于使Go語言成為一種更安全的內存語言。這種區別在處理指針時變得更加有趣。

  3. 注意在導入標識符時使用Go語言的包限定符。例如,對于實現格式化輸入和輸出的函數,類似于C語言的printfscanf,可以使用fmt包。該包在pkg.go.dev/fmt中有文檔。

  4. 在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開發工具等

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35777.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35777.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35777.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大數據-玩轉數據-Flink 自定義Sink(Mysql)

一、說明 如果Flink沒有提供給我們可以直接使用的連接器&#xff0c;那我們如果想將數據存儲到我們自己的存儲設備中&#xff0c;mysql 的安裝使用請參考 mysql-玩轉數據-centos7下mysql的安裝 創建表 CREATE TABLE sensor (id int(10) ) ENGINEInnoDB DEFAULT CHARSETutf8二…

二 根據用戶行為數據創建ALS模型并召回商品

二 根據用戶行為數據創建ALS模型并召回商品 2.0 用戶行為數據拆分 方便練習可以對數據做拆分處理 pandas的數據分批讀取 chunk 厚厚的一塊 相當大的數量或部分 import pandas as pd reader pd.read_csv(behavior_log.csv,chunksize100,iteratorTrue) count 0; for chunk in …

DNS協議及其工作原理

DNS是域名系統&#xff08;Domain Name System&#xff09;的縮寫&#xff0c;它是一種用于將域名轉換為IP地址的分布式數據庫系統。它是因特網的基石&#xff0c;能夠使人們通過域名方便地訪問互聯網&#xff0c;而無需記住復雜的IP地址。 DNS的歷史可以追溯到1983年&#xf…

4個簡化IT服務臺任務的ChatGPT功能

最近幾個月&#xff0c;ChatGPT 風靡全球&#xff0c;這是一個 AI 聊天機器人&#xff0c;使用戶能夠生成腳本、文章、鍛煉圖表等。這項技術在各行各業都有無窮無盡的應用&#xff0c;在本文中&#xff0c;我們將研究這種現代技術如何幫助服務臺團隊增強服務交付和客戶體驗。 什…

最佳實踐:如何優雅地提交一個 Amazon EMR Serverless 作業?

《大數據平臺架構與原型實現&#xff1a;數據中臺建設實戰》一書由博主歷時三年精心創作&#xff0c;現已通過知名IT圖書品牌電子工業出版社博文視點出版發行&#xff0c;點擊《重磅推薦&#xff1a;建大數據平臺太難了&#xff01;給我發個工程原型吧&#xff01;》了解圖書詳…

章節7:XSS檢測和利用

章節7&#xff1a;XSS檢測和利用 測試payload <script>alert(XSS)</script> <script>alert(document.cookie)</script> ><script>alert(document.cookie)</script> ><script>alert(document.cookie)</script> &qu…

元宇宙之經濟(02)理解NFT

1 NFT是什么&#xff1f; 想象一下&#xff0c;你小時候曾經在操場上集齊過各種不同的貼紙&#xff0c;然后和朋友們交換&#xff0c;這些貼紙有著獨特的圖案和價值。NFT的概念與此類似&#xff0c;但在數字世界中運作。NFT是一種基于區塊鏈技術的數字資產&#xff0c;每個NFT…

golang—面試題大全

目錄標題 sliceslice和array的區別slice擴容機制slice是否線程安全slice分配到棧上還是堆上擴容過程中是否重新寫入go深拷貝發生在什么情況下&#xff1f;切片的深拷貝是怎么做的copy和左值進行初始化區別slice和map的區別 mapmap介紹map的key的類型map對象如何比較map的底層原…

《Java極簡設計模式》第03章:工廠方法模式(FactoryMethod)

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章匯總&#xff1a;https://binghe.gitcode.host/md/all/all.html 源碼地址&#xff1a;https://github.com/binghe001/java-simple-design-patterns/tree/master/j…

無法正確識別車牌(Python、OpenCv、Tesseract)

我正在嘗試識別車牌&#xff0c;但出現了錯誤&#xff0c;例如錯誤/未讀取字符 以下是每個步驟的可視化&#xff1a; 從顏色閾值變形關閉獲得遮罩 以綠色突出顯示的車牌輪廓過濾器 將板輪廓粘貼到空白遮罩上 Tesseract OCR的預期結果 BP 1309 GD 但我得到的結果是 BP 1309…

騰訊云標準型CVM云服務器詳細介紹

騰訊云CVM服務器標準型實例的各項性能參數平衡&#xff0c;標準型云服務器適用于大多數常規業務&#xff0c;例如&#xff1a;web網站及中間件等&#xff0c;常見的標準型云服務器有CVM標準型S5、S6、SA3、SR1、S5se等規格&#xff0c;騰訊云服務器網來詳細說下云服務器CVM標準…

NAS搭建指南一——服務器的選擇與搭建

一、服務器的選擇 有自己的本地的公網 IP 的請跳過此篇文章按需求選擇一個云服務器&#xff0c;目的就是為了進行 frp 的搭建&#xff0c;完成內網穿透我選擇的是騰訊云服務器&#xff0c;我的配置如下&#xff0c;僅供參考&#xff1a; 4. 騰訊云服務器官網地址 二、服務器…

docker 鏡像的導出與導入 save 與 load

一、鏡像導出 docker save 導出 將系統中的鏡像保存為壓縮包&#xff0c;進行文件傳輸。使用 docker save --help 查看命令各參數&#xff0c;或者去docker官網查看.以 hello-world鏡像為例。 A&#xff1a;將鏡像保存為tar包 docker save image > package.tar docker sa…

day9 10-牛客67道劍指offer-JZ66、19、20、75、23、76、8、28、77、78

文章目錄 1. JZ66 構建乘積數組暴力解法雙向遍歷 2. JZ19 正則表達式匹配3. JZ20 表示數值的字符串有限狀態機遍歷 4. JZ75 字符流中第一個不重復的字符5. JZ23 鏈表中環的入口結點快慢指針哈希表 6. JZ76 刪除鏈表中重復的結點快慢指針三指針如果只保留一個重復結點 7. JZ8 二…

gitblit-使用

1.登入GitBlit服務器 默認用戶和密碼: admin/admin 2.創建一個新的版本庫 點擊圖中的“版本庫”&#xff0c;然后點擊圖中“創建版本庫” 填寫名稱和描述&#xff0c;注意名稱最后一定要加 .git選擇限制查看、克隆和推送勾選“加入README”和“加入.gitignore文件”在圖中的1處…

使用IIS服務器部署Flask python Web項目

參考文章 ""D:\Program Files (x86)\Python310\python310.exe"|"D:\Program Files (x86)\Python310\lib\site-packages\wfastcgi.py"" can now be used as a FastCGI script processor參考文章 請求路徑填寫*&#xff0c;模塊選擇FastCgiModule&…

一鍵部署 Umami 統計個人網站訪問數據

談到網站統計&#xff0c;大家第一時間想到的肯定是 Google Analytics。然而&#xff0c;我們都知道 Google Analytics 會收集所有用戶的信息&#xff0c;對數據沒有任何控制和隱私保護。 Google Analytics 收集的指標實在是太多了&#xff0c;有很多都是不必要的&#xff0c;…

Javascript 深入了解map

map() 是 JavaScript 數組提供的一個高階函數&#xff0c;它用于對數組中的每個元素執行指定的函數&#xff0c;并返回一個新的數組&#xff0c;新數組中的元素是原數組中的每個元素經過函數處理后的結果。 map() 函數的語法如下&#xff1a; javascript array.map(callback(…

Multi-object navigation in real environments using hybrid policies 論文閱讀

論文信息 題目&#xff1a;Multi-object navigation in real environments using hybrid policies 作者&#xff1a;Assem Sadek, Guillaume Bono 來源&#xff1a;CVPR 時間&#xff1a;2023 Abstract 機器人技術中的導航問題通常是通過 SLAM 和規劃的結合來解決的。 最近…

優化堆排序(Java 實例代碼)

目錄 優化堆排序 Java 實例代碼 src/runoob/heap/HeapSort.java 文件代碼&#xff1a; 優化堆排序 上一節的堆排序&#xff0c;我們開辟了額外的空間進行構造堆和對堆進行排序。這一小節&#xff0c;我們進行優化&#xff0c;使用原地堆排序。 對于一個最大堆&#xff0c;首…