likes
comments
collection
share

比较编程语言C和Go

作者站长头像
站长
· 阅读数 12

使用一个简单的计数程序来比较古老的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

更多技术干货请关注公众号“云原生数据库

squids.cn,目前可体验全网zui低价RDS,免费的迁移工具DBMotion、SQL开发工具等