简单对比一下 C 与 Go 两种语言

这篇具有很好参考价值的文章主要介绍了简单对比一下 C 与 Go 两种语言。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/U6jIT837x5Yxe6Ev1aMDsA

使用一个简单的计数程序将古老的 C 语言与现代 Go 进行比较。

简单对比一下 C 与 Go 两种语言

Go 是一种现代编程语言,追溯其历史大部分源自编程语言 C。所以,任何熟悉 C 语言的开发者都可能会觉得 Go 很熟悉。C 程序员使用 Go 编写新程序变得容易,同时避免了 C 编程语言的许多常见缺陷。

下面通过实现一个简单的加法逻辑,来比较 C 和 GO 的区别。该程序将数字从一加到十,计算过程和结果数值都比较小,所以代码仅使用普通整数变量。像这样的循环逻辑在编程中很常见,所以对比效果会显而易见。

C 语言做循环

C 语言中的基本循环是 for 循环,它可以实现对一组值的迭代访问。

for 基本语法:

for (初始化条件; 判断条件为真; 每次循环之后的操作) {
  // do something;
}

比如,可以编写一个循环,初始化条件时设置变量 count 为 1,然后判断 count <= 10 为真时执行 {} 内的语句,在再次执行条件判断之前,对变量 count 增加 1。直到判断 count <= 10 为假就退出循环。

在每次迭代后,对变量 count 增加 1,除了常规的 count = count + 1 书写格式之外,也可以对变量采用 ++ 的自加操作符,这种变通可以使得代码更简洁易读。

在循环内部,为了直观查看变量的变化过程,可以使用标准库函数 printf 打印变量 count 的值:

for (int count = 1; count <= 10; count ++) {
  printf("%d\n", count);
}

为了演示完整的逻辑,下面是一个示例程序,将数字从 1 加到 10,然后打印和的结果。

#include <stdio.h>
int main()
{
  puts("adding 1 to 10 ..");
  int sum = 0;
  for (int count = 1; count <= 10; count ++) {
    sum += count;
  }
  
  printf("sum is %d\n", sum);
  return 0;
}

上面的代码使用了两种函数把信息打印出来,最终输出到标准输出 stdout。puts 函数打印一个字符串,直到遇到字符串的空字符,而 printf 函数支持格式化打印,非常灵活,所以更常用。关键字 %d 表示打印一个十进制(或整数)值,\n 表示换行符。

如果编译并运行该程序,你将看到以下输出:

adding 1 to 10 ..
sum is 55

GO 语言做循环

在 GO 语言中,同样提供了 for 循环,而且与 C 语言中的 for 循环语法非常相似,甚至可以直接转换成 GO 的书写格式。

下面为了直观查看变量的变化过程,在循环内部同样使用方法打印变量 count 的值:

var count int
for count = 1; count <= 10; count ++ {
  fmt.Printf("%d\n", count)
}

fmt 是包名,使用包之前需要先导入,用关键词 import。C 语言中就没有导入包的概念,只能通过包含头文件 .h 来引入其它现成模块。

fmt 实现了类似 C 语言的打印输出 printf 和读取输入 scanf。fmt.Printf 方法也是支持格式化输出的,甚至格式变量就是从 C 语言的 printf 派生而来。

在 C/C ++ 代码中,比较推荐的编码规范中通常每行是只写一句操作语句,虽然语法上多个操作语句是允许书写在同一行的,但这样易读性就很差。有没有发现,在每行 GO 语句的末尾都没有分号 ';' 了? 因为 GO 编译器默认每行就是一个语句,这样其实是强制提高了代码的可读性。

再来看看 GO 语言实现的完整逻辑,基于上面的 C 语言代码版本直接翻译如下

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("sum is %d\n", sum)
}

上面的代码是有效和可以正确运行输出的,但是这很不 GO ! GO 不单单是一门语言,也是一种态度。

有没有看到 C 语言版本中, for 循环里的初始化条件是可以同时声明定义并赋值变量的?换成在 GO 中是否也支持类似操作?

在 GO 中,有个声明变量并赋值的操作符 :=,就可以做到

for count := 1; count <= 10; count ++ {
  sum = sum + count
}

另外,你如果再细心一点可能会发现,GO 代码里声明定义的变量会被默认初始化为 0,而 C 代码中定义的变量如果未经初始化会是任何未知的值,如此看来 GO 的安全性有了很大的提高。

变量的生命周期管理对开发者来说是很耗费心智的,所以很多时候变量的声明定义都是应该尽量靠近使用的地方,并且缩窄变量的生命周期,对于事故的发生可以有效缩小排查错误的范围,简直就是在打救程序员的生命啊。

再来看看,优化后的 GO 范式代码

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("sum is %d\n", sum)
}

看到这里,和 C 代码的 main 函数比起来,GO 的 main 函数没有显式的返回值。实际上,GO 的 main 函数默认返回值 0,如果需要返回其它值,可以调用 os.Exit(n) 返回值 n,这个方法可在任何位置调用,程序会在调用该方法后会终止运行并退出,就类似 C 语言中的标准库函数 exit(n) 一样。

简单回顾

从上面的逻辑实现过程来看,两种语言实现过程差别不大,语法上是有差别的,书写的习惯其实就透露着各自的态度。

虽然老气横秋的 C 语言代码很多,但是如果按照现代 C 语言书写规范来看,GO 的代码是何其相似。

虽然你会说新出来的语言有很多方便到爆炸的语法糖。但问题是,语言的精髓是语法糖吗?答案不唯一,酸甜苦辣唯有尝过的人才知道。文章来源地址https://www.toymoban.com/news/detail-669515.html

到了这里,关于简单对比一下 C 与 Go 两种语言的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go 与 Rust:现代编程语言的深度对比

    在快速发展的软件开发领域中,选择合适的编程语言对项目的成功至关重要。Go 和 Rust 是两种现代编程语言,它们都各自拥有一系列独特的特性和优势。本文旨在深入比较 Go 和 Rust,从不同的角度分析这两种语言,包括性能、语言特性、生态系统、适用场景以及社区支持。

    2024年04月13日
    浏览(51)
  • 【C语言】湖科大信计专业大一下C语言实验简单30题

    1、有一分数序列:2/1 , 3/2, 5/3, 8/5 …求这个序列的前20项之和为。 A、31.660259 B、331.660259 C、332.660259 D、32.660259 2、设某4位数的各位数字的平方和等于100,问: 1)共有多少个这种4位数; 2)最大的那个数。 A)47,9331 B) 47,9332 C)49,9331 D) 49,9332 3、输出2000内的素数个数并求所有

    2024年02月08日
    浏览(32)
  • 自然语言处理:提取长文本进行文本主要内容(文本意思)概括 (两种方法,但效果都一般)

    本文主要针对长文本进行文本提取和中心思想概括,原文档放在了附件里面:科大讯飞公告 -----------------------------------方法一:jieba分词提取文本(句子赋分法)------------------------- 1、首先导入相关库并读取文档内容: 这里仅作演示所以只读取了文档的第一条数据文本,如果

    2024年02月10日
    浏览(48)
  • php基础学习之分支结构和循环结构(不细讲,来对比一下和两大常用高级编程语言(C++/Java)的细微区别以便记忆)

    编程语言常见分支结构有: if 语句 if-else 语句 if-elseif-else 语句 switch 语句 其中, 除了 if-elseif-else 语句外,另外3中分支语句在php中和C++/Java是一模一样的! 而 if-elseif-else 的唯一不同点就在,【 elseif 】这个既可以合一起写(C++/Java不可以),也可以拆开写成【 else if

    2024年02月19日
    浏览(48)
  • Powershell删除文本指定内容所在行以下内容

    需求:批量获取文本指定内容所在行以下内容(含当前行)   解决方案:使用Powershell脚本处理   案例: 获取当前文件夹下所有txt文件 含文本\\\"4\\\"所在行 以下内容(含当前行) 如果有多行包含文本\\\"4\\\",取第一个所在行以下内容(含当前行)   1.查看当前文件夹内容   2.右键执

    2024年01月20日
    浏览(39)
  • 【C语言】杨辉三角常用且简单的两种解法(超详细解说)

    学习就是重复重复再重复!!! ​​​​​​​​​​​​​​ 目录  💙杨辉三角简介 ❤️解法1:数组法 💛思路实现 💓代码实现 💖前提准备  💜写入 💚输出 💗源代码  💕解法二:递归法 💘思路实现  🌟代码实现  ⭐️主函数 💥递归函数  ❄️源代码 🐇总结

    2024年02月05日
    浏览(37)
  • go语言简单实现区块链

            在本文中,我们将使用Go语言来实现一个简单的区块链系统,包括区块生成、交易处理和区块打印、保存区块链等功能。 在开始之前,先确保计算机上安装了以下内容: Go编程语言:您可以从Go官方网站下载并安装Go。 Go开发环境:设置Go开发环境,包括文本编辑器

    2024年04月16日
    浏览(38)
  • 【go语言开发】本地缓存的使用,从简单到复杂写一个本地缓存,并对比常用的开源库

    本文主要介绍go语言中本地缓存的使用,首先由简单到复杂手写3个本地缓存示例,使用内置的sync,map等数据结构封装cache,然后介绍常见的一些开源库,以及对比常用的开源库 本地缓存 是指将一部分数据存储在应用程序本地内存中,以提高数据访问速度和应用程序性能的技

    2024年02月04日
    浏览(36)
  • 【go语言开发】redis简单使用

    本文主要介绍redis安装和使用。首先安装redis依赖库,这里是v8版本;然后连接redis,完成基本配置;最后测试封装的工具类 欢迎大家访问个人博客网址:https://www.maogeshuo.com,博主努力更新中… 参考文件: Yaml文件配置,Config使用 Log日志封装 常用工具类封装 命令行安装redis

    2024年03月12日
    浏览(60)
  • 论文浅尝 | SimKGC:基于预训练语言模型的简单对比知识图谱补全

    笔记整理:李雅新,天津大学硕士,研究方向为知识图谱补全 链接:https://dl.acm.org/doi/10.1145/3539597.3570483 动机 知识图谱补全 (KGC) 旨在对已知事实进行推理并推断缺失的链接。基于文本的方法从自然语言描述中学习实体表示,并且具有归纳KGC的潜力。然而,基于文本的方法的

    2024年02月11日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包