比较编程语言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.mzph.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;首…