比较编程语言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 int
  fmt.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 int
  for 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

更多技术干货尽在wx“云原生数据库”

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容