C 语言 vs. Go 语言:编程语言对比

使用一个简单的计数程序来比较历史悠久的 C 语言和现代 Go 语言。
5 位读者喜欢这篇文章。
Pair programming

WOCinTech Chat。Opensource.com 修改。CC BY-SA 4.0

Go 是一种现代编程语言,其历史很大程度上源于 C 编程语言。因此,对于任何用 C 语言编写程序的人来说,Go 语言可能会感到熟悉。Go 语言使编写新程序变得容易,同时对于 C 程序员来说又感觉熟悉,但避免了 C 编程语言的许多常见陷阱。

本文比较了一个简单的 C 语言和 Go 语言程序,该程序将从一到十的数字相加。由于此程序仅使用小数值,因此数字不会变得太大,因此它们仅使用普通整数变量。像这样的循环在编程中非常常见,因此这个简单的程序可以轻松比较 C 语言和 Go 语言。

如何在 C 语言中进行循环

C 语言中的基本循环是 for 循环,它允许您遍历一组值。for 循环的基本语法是

for (起始条件 ; 结束条件 ; 每次迭代后的操作) { 循环内要执行的操作 ; }

您可以编写一个 for 循环来打印从一到十的数字,方法是将起始条件设置为 count = 1,将结束条件设置为 count <= 10。这将从 count 变量等于 1 开始循环。结束条件意味着只要 count 变量小于或等于 10,循环就会继续。

每次迭代后,您可以使用 count = count + 1count 变量的值递增 1。在循环内部,您可以使用 printf 打印 count 变量的值

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

C 语言编程中的一个常见约定是 ++,它表示“将某物加一”。如果您编写 count++,则与 count = count + 1 相同。大多数 C 程序员会使用它来编写 for 循环,并使用 count++ 作为每次迭代后的操作,如下所示

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

这是一个示例程序,用于将从一到十的数字相加,然后打印结果。使用 for 循环遍历数字,但不是打印数字,而是将数字添加到 sum 变量中

#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 语言 for 循环非常相似的 for 循环。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 语言习惯的方式更新上述程序,您可以进行一些小的修改

  1. 使用 += 自加 运算符将 sum = sum + count 更简洁地写成 sum += count。C 语言也可以使用这种风格。

  2. 使用 赋值并推断类型运算符count := 1 而不是 var count int 后跟 count = 1:= 语法同时定义和初始化 count 变量。

  3. count 的声明移到 for 循环的头部本身。这减少了一些认知开销,并通过减少程序员在任何时候必须在脑海中考虑的变量数量来提高可读性。此更改还通过尽可能靠近变量的使用位置并在尽可能小的作用域内声明变量来提高安全性。这降低了在代码演变过程中意外操作的可能性。

上述更改的组合结果是

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)
}

您可以使用此链接在 Go Playground 中试用此示例程序 go.dev

C 语言和 Go 语言相似但又不同

通过用两种编程语言编写相同的程序,您可以看到 C 语言和 Go 语言相似但又不同。以下是从 C 语言过渡到 Go 语言时需要记住的一些重要提示

  • 在 C 语言中,每个编程指令都必须以分号结尾。这告诉编译器一个语句在哪里结束,下一个语句在哪里开始。在 Go 语言中,分号是有效的,但几乎总是被推断出来。

  • 虽然大多数现代 C 编译器会将变量初始化为零值,但 C 规范表示变量会获得当时内存中的任何值。Go 语言值始终初始化为零值。这有助于使 Go 语言成为一种更内存安全的语言。这种区别在指针方面变得更加有趣。

  • 请注意在导入的标识符上使用 Go 包说明符。例如,fmt 用于实现格式化输入和输出的函数,类似于 C 语言中来自 stdio.hprintfscanffmt 包记录在 pkg.go.dev/fmt 中。

  • 在 Go 语言中,main 函数始终以退出代码 0 返回。如果您希望返回其他值,则必须调用 os.Exit(n),其中 n 通常为 1 以指示错误。可以从任何地方(而不仅仅是 main)调用此函数来终止程序。您可以使用在 stdlib.h 中定义的 exit(n) 函数在 C 语言中执行相同的操作。

photo of Jim Hall
Jim Hall 是一位开源软件倡导者和开发者,以 GNOME 中的可用性测试以及作为 FreeDOS 的创始人兼项目协调员而闻名。

评论已关闭。

Creative Commons License本作品根据 知识共享许可协议 署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.