引言
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它在编程语言中具有举足轻重的地位。
此文为【C语言必知必会】系列第一篇,带你初步了解C语言,为之后的学习打下基础
C语言起源于美国贝尔实验室的贝尔实验室,由丹尼斯·里奇和肯尼斯·汤普森于20世纪70年代初期开发而成。起初,他们使用B语言对UNIX操作系统进行了改进,并逐步将其重写成了C语言。
随着UNIX的发展,C语言也得到了不断的完善和推广。为了确立C语言的标准,许多专家、学者和硬件厂商参与组建了C语言标准委员会。1989年,他们发布了第一个完整的C语言标准,即ANSI C(C89)。
随后,C语言标准经历了多次修订和更新。1999年发布了C99标准,其中包含了一些新的特性和语法改进。2011年发布了C11标准,进一步扩展了C语言的功能和表达能力。
C语言以其简洁、高效、可移植性和广泛应用性而闻名。它成为了许多编程领域的首选语言,包括系统级编程、嵌入式系统开发、操作系统设计等。 许多重要的软件和工具,如UNIX、Linux和MySQL等,都是使用C语言开发的。
截至目前,在计算机科学和软件工程领域,C语言仍然是一门重要且广泛应用的编程语言,对后续语言的发展也产生了深远的影响。
C语言是一种结构化语言,它有着清晰的层次,可按照模块的方式对程序进行编写,十分有利于程序的调试,且c语言的处理和表现能力都非常的强大,依靠非常全面的运算符和多样的数据类型,可以轻易完成各种数据结构的构建,通过指针类型更可对内存直接寻址以及对硬件进行直接操作,因此既能够用于开发系统程序,也可用于开发应用软件。
C语言具有以下几个主要的语言特点:
1.C语言的语法相对简单,并且提供了一些核心的编程结构,使得程序员可以用更少的代码实现功能。C语言的底层控制和内存管理能力使其在编写高效的程序时具有优势。
2.C语言是一种面向过程的编程语言,它侧重于按照顺序执行一系列操作步骤,通过函数调用和模块化的方式组织代码。这种特点使得C语言非常适合系统级编程和底层开发。
3.可移植性强:C语言的标准化以及对底层硬件的直接访问使得它在不同平台和操作系统上具有很高的可移植性。C语言编写的程序通常可以在多个系统上进行编译和运行。
4.C语言提供了指针的概念,允许直接访问和操作内存地址。 这为程序员提供了更高的灵活性和对底层资源的直接控制能力。
5.C语言提供了广泛的标准库,包含了大量的函数和工具,可以方便地进行文件操作、字符串处理、内存分配等常见任务。
总而言之,C语言以其简洁
、高效
、可移植
和底层控制能力
而闻名,成为广泛应用于系统级编程、嵌入式开发和底层软件开发的重要语言。
数据类型:
C语言中的数据类型用来定义变量的性质和存储空间的大小。常见的数据类型包括整型(int)
、浮点型(float、double)
、字符型(char)
,以及派生的复杂数据类型如结构体(struct)
和枚举(enum)
等。
常量与变量:
在C语言中,常量是指在程序执行期间值不会改变的数据。常量可以是字面值(如整数、浮点数、字符等)或使用const关键字进行声明。变量是用于存储和表示可变数据的标识符。 在使用变量之前,需要先声明并指定其数据类型。
注意: 变量名是由字母、数字和下划线组成
的标识符,且不能以数字开头
。变量名区分大小写,例如myVariable和myvariable是不同的变量名。
数组:
数组是相同数据类型的元素按一定次序排列而成的集合。在C语言中,数组使用方括号[]
来声明,并通过下标访问其中的元素。数组的大小在声明时确定,并且下标从0开始。
指针:
指针是用来存储变量地址的变量。通过指针,我们可以直接访问和操作内存中的数据。在C语言中,可以使用星号*
来声明指针变量,并通过取地址运算符&
获取变量的地址,或者通过解引用运算符*
访问指针指向的值。
字符串:
字符串是由字符组成的数组,以空字符'\0'
作为结束标志。在C语言中,可以使用字符数组或者指针来表示字符串,并通过一系列的字符串操作函数(如strcpy、strlen等)进行处理。
运算符:
C语言提供了各种各样的运算符,用于完成不同类型的运算任务。常见的运算符包括算术运算符(+、-、*、/等)、关系运算符(<、>、==等)、逻辑运算符(&&、||、!等)等。
算术运算符>逻辑运算符>赋值运算符
例如,表达式a + b * c
中,乘法运算符的优先级高于加法运算符,所以先计算b * c
,然后再与a
相加。如果要先计算a + b
,可以使用括号来改变优先级,如(a + b) * c
。
示例如下:
#include
int main() {
int a = 10, b = 5, c = 2;
int result;
result = a + b * c; // 优先级:乘法 > 加法
printf("a + b * c = %d\n", result);
result = (a + b) * c; // 优先级:括号 > 加法 > 乘法
printf("(a + b) * c = %d\n", result);
result = a / b + c; // 优先级:除法 > 加法
printf("a / b + c = %d\n", result);
result = a / (b + c); // 优先级:括号 > 加法 > 除法
printf("a / (b + c) = %d\n", result);
result = a % b + c * 2; // 优先级:乘法 > 取模 > 加法
printf("a %% b + c * 2 = %d\n", result);
result = (a % b) + (c * 2); // 优先级:括号 > 取模 > 乘法 > 加法
printf("(a %% b) + (c * 2) = %d\n", result);
return 0;
}
结果如下:
了解运算符的优先级可以帮助我们编写正确和清晰的表达式,并避免出现不必要的错误。
关键字:
关键字又称为保留字,就是已被C语言本身使用,不能作其它用途使用的字。 例如关键字不能用作变量名、函数名等标识符。
数据类型关键字:
short
:修饰int,短整型数据,可省略被修饰的int。(K&R时期引入)
long
:修饰int,长整型数据,可省略被修饰的int。(K&R时期引入)
long long
:修饰int,超长整型数据,可省略被修饰的int。(C99标准新增)
signed
:修饰整型数据,有符号数据类型。(C89标准新增)
unsigned
:修饰整型数据,无符号数据类型。(K&R时期引入)
restrict
:用于限定和约束指针,并表明指针是访问一个数据对象的初始且唯一的方式。(C99标准新增)
复杂类型关键字:
struct
:结构体声明。(K&R时期引入)
union
:联合体声明。(K&R时期引入)
enum
:枚举声明。(C89标准新增)
typedef
:声明类型别名。(K&R时期引入)
sizeof
:得到特定类型或特定类型变量的大小。(K&R时期引入)
inline
:内联函数用于取代宏定义,会在任何调用它的地方展开。(C99标准新增)
存储级别关键字:
auto
:指定为自动变量,由编译器自动分配及释放。通常在栈上分配。与static相反。当变量未指定时默认为auto。(K&R时期引入)
static
:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部。(K&R时期引入)
register
:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数。(K&R时期引入)
#include
int main() {
register int i; // 声明一个寄存器变量
for (i = 0; i < 10; i++) {
printf("%d ", i);
}
return 0;
}
在上面的代码中,我们使用register关键字声明了一个整型变量i,然后在for循环中使用它进行迭代。
extern
:指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。(K&R时期引入)
const
:指定变量不可被当前线程改变(但有可能被系统或其他线程改变)。(C89标准新增)
volatile
:指定变量的值有可能会被系统或其他线程改变,强制编译器每次从内存中取得该变量的值,阻止编译器把该变量优化成寄存器变量。(C89标准新增)
这些概念是C语言中非常重要的基础知识,对于理解和编写C程序至关重要。
此文为 【C语言必知必会】系列之第一篇 ,带领读者初步了解C语言,为之后的学习打下坚实的理论基础。
后续将发布 【C语言必知必会】系列之第二篇:编译器的安装与使用,读者可订阅专栏持续跟进专栏更新。