本文将对C语言和Go语言进行简单的对比
让我们通过编写一个简单的计数程序来比较古老的 C 语言与现代的 Go
Go语言是一种现代的编程语言,与古老的C语言有着很深的渊源。因此,对于熟悉C语言的开发者来说,使用Go语言编写程序会感到非常熟悉。Go语言在设计和实现上吸取了许多C语言的优点,同时也避免了许多C编程的常见缺陷。
下面,我们将通过实现一个简单的计数程序来比较C语言和Go语言的差异。这个程序将计算从1加到10的结果,并使用普通的整数变量来存储过程和结果。这样的循环逻辑在编程中非常常见,因此对比效果会非常明显。
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 的代码是何其相似。虽然你会说新出来的语言有很多方便到爆炸的语法糖。但问题是,语言的精髓是语法糖吗?答案不唯一,酸甜苦辣唯有尝过的人才知道。
C语言
Go语言
编程
网站建设
阅读排行
-
1. 几行代码就能实现Html大转盘抽奖
大转盘抽奖是网络互动营销的一种常见形式,其通过简单易懂的界面设计,让用户在游戏中体验到乐趣,同时也能增加商家与用户之间的互动。本文将详细介绍如何使用HTML,CSS和JavaScript来实现大转盘抽奖的功能。
查看详情 -
2. 浙江省同区域公司地址变更详细流程
提前准备好所有需要的资料,包含:房屋租赁合同、房产证、营业执照正副本、代理人身份证正反面、承诺书(由于我们公司其中一区域已有注册另外一公司,所以必须需要承诺书)
查看详情 -
3. 微信支付商户申请接入流程
微信支付,是微信向有出售物品/提供服务需求的商家提供推广销售、支付收款、经营分析的整套解决方案,包括多种支付方式,如JSAPI支付、小程序支付、APP支付H5支付等支付方式接入。
查看详情 -
4. 阿里云域名ICP网络备案流程
根据《互联网信息服务管理办法》以及《非经营性互联网信息服务备案管理办法》,国家对非经营性互联网信息服务实行备案制度,对经营性互联网信息服务实行许可制度。
查看详情 -
5. 微信小程序申请注册流程
微信小程序注册流程与微信公众号较为相似,同时微信小程序支持通过已认证的微信公众号进行注册申请,无需进行单独认证即可使用,同一个已认证微信公众号可同时绑定注册多个小程序。
查看详情