Linux 上的 C 开发 - C 与其他编程语言的比较 - 二.
由于在本文的第一部分中,我们说过我们希望读者具备一些编程知识,因此在这一部分中,我们希望帮助您了解 C 与您可能知道的其他编程语言相比的情况。由于各种标准,这些语言的选择相当困难,但最终我们停在了 C++、Perl 和 Python。由于编程语言可以通过多种方式进行分类(例如,取决于范例、语法或风格),因此我们并没有试图找到与 C 属于同一类别的语言。相反,因为上述语言在在 Linux 世界中,我们选择了它们,提到了每种语言在这个伟大计划中的地位、通常用于什么,当然还有它们与 C 之间的差异。本文的结构如下:我们将从重要元素开始每种语言的功能,例如变量声明、类型或结构,并将其与 C 的实现方式进行比较。因此,我们希望在开始之前让您对该语言有一个了解。本文的组成部分将与本文公布的结构完全相同,以便于理解。
类型、运算符、变量
C++
C++ 最初被命名为“带有类的 C”,这充分说明了它与 C 的关系。它被广泛视为 C 的超集(因此 C++ 是一元增量运算符 ++ ),引入了面向对象的编程功能。类型的使用本质上是相同的,C++ 中引入了 bool 来进行布尔运算。基本上,当谈论 C 和 C++ 的差异时,大多数来自 C++ 具有而 C 没有的 OOP 概念。例如,C++ 具有运算符重载,这是一个特定于 OOP 的术语,这意味着运算符可能根据其所操作的数据而具有不同的实现。例如,在 C++ 中,您可以这样做:
a << 2
现在,如果 a 是一个整数,这将对其执行按位操作(左移 2),但如果 a 是输出流,则上面的行将尝试向其写入“2”。这种行为是 C++ 因允许不良编程实践而受到批评的原因之一。变量和常量的声明方式与 C 中相同。
珀尔
使用 Perl 就更简单了:它只有三种数据类型。它们是标量、数组和散列或关联数组。标量以美元符号为前缀,数组以 @ 为前缀,散列以 %s 为前缀。关于类型的区别在于 Perl 是一种动态编程语言,而 C 是弱类型的,这意味着在 C 中您将处理变量的正确声明,例如“这个变量是一个整数”或“另一个变量是指向一个漂浮物”。算术运算符的区别只是 Perl 有“**”表示求幂,而 C 需要一个函数来实现这一点。
Python
Python 的变量声明是基于上下文的。例如,我们要声明一个字符串、一个整数和一个浮点数:
var1 = "String"
var2 = 100
var3 = 100.98
如果使用 C,这会是这样的
char* var1 = "String";
int var2 = 100;
float var3 = 100.98;
C 没有像其他语言那样的字符串类型,因此必须将字符串声明为字符数组或指向字符的指针,而 Python 提供数字、字典、字符串、列表和元组作为数据类型。
流量控制
这里描述的所有四种语言在流量控制方面都有许多共同点。例如,当启动 if 块时,不需要结束关键字,就像 Bash 或 Algol68 中的 fi 一样。说到 if 块,语法是相似的,所以如果你曾经用 C++、Perl 或 Python 编程,你会发现 C 的方式非常熟悉。对于其余的流控制操作也可以这样说:for、do、while、switch/case 或 Break/Continue。同样,如果您习惯了这三种语言进行流程控制的方式,您将需要几分钟来习惯 C。一些主要区别可能是: Perl 比 C 有更多的关键字来处理这个问题,例如 重做,上一个或下一个。 Python 有 pass 关键字......基本上什么都不做,但当需要一个空类时它很有用。例如:
class Empty:
pass
功能
C 中的简单函数声明如下:
int sum (int a, int b)
{
return a + b;
}
这将是一个名为 sum 的函数,它通过计算其参数 a 和 b(也是整数)的总和返回一个整数。请注意块,它们明确界定了函数体的开始位置和结束时间。在 Perl 中,术语“函数”与“子例程”可以互换使用。您可以像在 C 中一样,首先声明一个函数,然后定义它,或者一次性声明它并定义它,就像我们上面所做的那样。您必须使用 sub 关键字来告诉 Perl 解释器您想要做什么。在 Python 中,我们的求和示例如下所示:
def sum ( a, b ):
return a + b
您可能注意到我们没有提到 C++。嗯,就我们而言,C 和 C++ 在这方面没有区别。
指针和数组
指针是一个保存另一个变量的内存位置的变量。与 C 中一样,指针和数组紧密结合在一起,为 C++ 程序员提供了许多高级功能。同样,两者之间没有重要区别。 Perl 有提供相同功能的参考。例如,这段代码定义了一个名为 var 的变量和一个名为 refvar 的对该变量的引用:
$var = 20;
$refvar = \$var;
在C中,我们会做类似的事情
int var;
var = 20;
int *refvar;
refvar = &var;
Perl 和 Python 一样,不允许程序员直接进行内存操作。有些人认为这是一件好事,另一些人则不这么认为。 Python 提供了 ctypes,它是一个提供用于使用指针的 point() 函数的库。简而言之:Python 不使用指针。长话短说,Python 引用变量的方式(仅按值)与习惯 C 的程序员不同。
如果您在 C++ 或 Perl 上使用数组,则概念基本相同。 Perl 有不同的语法,但如果您已经知道数组是什么,那么使用 C 就可以了。Python 提供了提供此功能的 array 模块,因为它已经将列表作为基本类型,但数组的限制更严格。
结构
在 C 语言中,结构体是一个记录,其中包含一组固定的、带标签的对象,所有这些对象都包装成一个。例如:
struct customer {
int account;
char *name;
float balance;
};
引用维基百科,“在 C++ 中,结构是使用 struct
关键字定义的类。默认情况下,其成员和基类是公共的。使用 class
关键字定义的类默认具有私有成员和基类。这是 C++ 中结构和类之间的唯一区别。”在 Perl 版本 5 之前,结构是一个问题(或缺乏问题),但现在有了 perldsc(Perl 数据结构手册),可以在 perldoc.org 上找到。在 Python 中,你总是可以(好吧,几乎)使用元组或字典来实现这一点。
包括文件
正如您在第一部分中所看到的,在 C 中,使用预处理器指令来包含其他文件中的定义。 C++ 也提供了此功能,具有相同的语法,只不过头文件名为 $name.hpp 并且不需要文件扩展名:
#include <iostream>
iostream 是 stdio.h 的 C++ 等效项。在 Perl 中,我们有 use 关键字来实现此目的,可以像这样使用:
use Module;
在 Python 中,use 的等价物是 import,其使用方式与 Perl 中完全相同,只是它不需要末尾有分号。
其他考虑因素
你们中的许多人都注意到,我们选择用于比较的所有语言都是面向对象的,而 C 不是。这并不是一个不公平的比较,因为如果我们选择 Fortran 或 Prolog 作为我们的比较条件,由于今天许多程序员不使用这些语言,我们的文章很可能不会很受欢迎。另一方面,我们认为这是一种让你入门的方法,因为习惯是人性的一部分,如果你曾经使用过其中一种或多种语言,那么当你开始学习 C 时,你会更容易。因此,本文的这一部分旨在提供帮助,如果我们能够做到这一点,那就没问题了。
C 和 C++
有些人可能会想:如果 C++ 与 C 如此相似,但它更复杂并且提供更多功能,为什么还要费心使用 C?这个话题的讨论已经超出了应有的范围,我们将尝试给出我们自己的答案。首先,C 更简单。 K&R 有 266 页,而作者 Bjarne Stroustrup 的《C++ 编程语言》有 1090 页。’Nuff 说道。第二,现有代码。无论硬件架构、操作系统还是用途如何,C 语言都非常广泛。从操作系统内核到 GUI 库,C 都在那里并且无意离开任何地方。这并不是说许多开发人员不使用 C++。我们只是说,迟早你会发现自己必须使用 C 代码或使用受其影响的语言,所以 C 知识在简历上总是好看的。第三,如果你想学习 C 和 C++,你最好从 C 开始,因为它前面提到的简单性,而且一旦你掌握了基础知识,C++ 看起来会更容易学习。最后,这一切都与适合工作的工具有关。如果您需要快速的代码、低级的能力和简单的语言,请选择 C。
结论
在本文的第二部分之后,我们将开始在 Linux 上学习 C 编程,因为我们认为太多的介绍部分没有意义。我们很乐意为您提供帮助。
接下来您可以期待以下内容:
Linux 上的 I.C 开发 – 简介
二. C与其他编程语言的比较
三.类型、运算符、变量
四.流量控制
五、职能
六.指针和数组
七.结构
八.基本输入/输出
九.编码风格和建议
X. 构建一个程序
十一. Debian 和 Fedora 的打包
十二.在官方 Debian 存储库中获取软件包