1.C语言教程:历史、特点、版本与入门示例

news2025/1/8 14:08:30

目录

    • 1.历史
    • 2.特点
    • 3.版本
    • 4.编译
    • 5.Hello World 示例

1.历史

本篇原文为:C语言教程:历史、特点、版本与入门示例。

更多C++进阶、rust、python、逆向等等教程,可去此站查看:酷程网

C 语言的诞生源于 Unix 系统的开发需求。

1969 年,美国贝尔实验室的肯·汤普森(Ken Thompson)和丹尼斯·里奇(Dennis Ritchie)共同开发了 Unix 操作系统。

但由于 Unix 是用汇编语言编写的,不同类型的计算机所使用的汇编语言并不完全相同,这使得它无法在其他计算机上运行。

因此他们决定用一种高级语言重写系统,但当时的高级语言无法满足他们的需求,因此汤普森基于 BCPL 语言创造了 B 语言。

1972 年,丹尼斯·里奇和布莱恩·柯林汉(Brian Kernighan)在 B 语言的基础上重新设计了一种新语言,这便是 C 语言。1973 年,整个 Unix 系统被成功重写为 C 语言,随后,这种语言迅速传播并广泛应用于各类操作系统和系统软件的开发。

1988 年,美国国家标准协会(ANSI)正式将 C 语言标准化,这标志着 C 语言的稳定与规范化。

如今,C 语言依然是最为广泛使用和流行的系统编程语言之一,Unix 和 Linux 系统仍然依赖 C 语言进行开发。

2.特点

C 语言的持久生命力与广泛应用主要源于其显著的特点。

(1)低级语言

C 语言能直接操作硬件,进行内存管理,并与操作系统进行对话,因此被认为是一种接近底层的低级语言。这使其非常适合于编写需要与硬件交互或具有极高性能要求的程序。

(2)可移植性

C 语言的初衷是将 Unix 系统移植到其他计算机架构,这使得它在设计上极为注重可移植性。C 程序可以相对轻松地在各种硬件架构和操作系统之间移植。

不仅如此,C 语言还是嵌入式系统的首选语言,许多汽车、照相机及家电等设备的底层系统均使用 C 语言,这也得益于其良好的可移植性。

(3)简单性

C 语言的语法相对简洁,语法规则不多,几乎没有语法糖。一般来说,如果有两个语法能够完成类似的功能,C 语言只会提供其中一种,这大大降低了语言的复杂性。

同时,C 语言不提供复杂的数据结构,例如没有“类”(class),程序员需要自己构建复杂数据结构。

(4)灵活性

C 语言对程序员几乎没有限制,假设程序员知道自己在做什么,因此不限制潜在的危险操作,后果由程序员自负。

C 语言的哲学是“信任程序员,不要妨碍他们”。例如,C 语言允许程序员自行管理内存,而不提供内存自动清理的功能,也没有类型检查、数组负索引检查和指针位置检查等保护措施。

这种自由虽看似危险,但却为高级程序员提供了更大的编程灵活性。然而,这也使得 C 语言的调试变得更加困难。

上述特点使得 C 语言能编写出性能卓越、充分发挥硬件潜力的程序。此外,C 语言的编译器实现难度相对较低,但同时也意味着代码易出错,一般程序员不易编写出高质量代码。

值得注意的是,许多现代流行编程语言如 C++、Java、C# 和 JavaScript 等,都是以 C 语言为基础的,因此掌握 C 语言有助于加深对这些语言的理解。

3.版本

C 语言历史上经历了多个版本的发展。

(1)K&R C

K&R C 指的是 C 语言的原始版本。1978 年,C 语言的发明者丹尼斯·里奇(Dennis Ritchie)和布莱恩·柯林汉(Brian Kernighan)共同撰写了著名教材《C 编程语言》(The C Programming Language)。由于当时 C 语言尚无正式的语法标准,这本书便成为了公认的标准,以两位作者的姓氏首字母命名为“K&R C”。

(2)ANSI C(又称 C89 或 C90)

原始版本的 C 语言相对简单,对许多情况的描述模糊,加之语法仍在快速发展,因此对标准化的呼声日益高涨。1989 年,美国国家标准协会(ANSI)制定了一套 C 语言标准,1990 年国际标准化组织(ISO)通过了这一标准,称为“ANSI C”,也可以根据发布年份称为“C89”或“C90”。

(3)C95

1995 年,ANSI 对 C89 标准进行了补充,增加了对多字节字符和宽字符的支持,这个版本被称为 C95。

(4)C99

C 语言标准的首次重大修订发生在 1999 年,新增了许多语言特性,如双斜杠(//)注释语法。这个版本被称为 C99,目前是使用最广泛的 C 语言版本。

(5)C11

2011 年,标准化组织再次对 C 语言进行修订,增加了 Unicode 和多线程支持,这个版本称为 C11,同样使用广泛。

(6)C17

C11 标准于 2017 年进行了修补,尽管发布在 2018 年,此版本只解决了 C11 的一些缺陷,没有引入新功能,被称为 C17。

(7)C23

C标准化组织在 2024 年通过C23版本,新增更多功能:C23 (C语言标准)

4.编译

C 语言是一种编译型语言,源代码存储为文本文件,无法直接执行。必须通过编译器生成二进制可执行文件后才能运行。

编译器将代码从文本翻译为二进制指令的过程称为编译阶段,亦称“编译时”,与运行阶段(或“运行时”)相区分。

目前,最常用的 C 语言编译器是自由软件基金会推出的 GCC 编译器,用户可以免费使用,但其主要用于linux系统。

像我们平时大多数人使用的都是WIndows系统,想要开发C语言程序,最佳方式是按照Visual Studio,其内已经内置了C++语言编译器,由于C++完全兼容C语言,因此可以直接使用。

使用方式可以参考文章:初识C++

如果你就是想要在windows系统上使用linux系统编译环境,那么最佳方案是安装wsl使用:Linux系统入门。

此外,网上也提供了多种在线编译器,方便用户直接在网页上模拟运行 C 代码并查看结果,以下是两个示例:

  • CodingGround
  • OnlineGDB
  • C 在线工具

5.Hello World 示例

C 语言的源代码文件通常以 .c 结尾。下面是一个简单的 C 程序 hello.c,它是一个普通的文本文件,任何文本编辑器都可以用来编写,比如linux下的vim编辑器,window下的记事本。

#include <stdio.h>
int main(void) 
{
	printf("Hello World\n");
	return 0;
}

上述程序的唯一作用是在屏幕上显示“Hello World”。

这里不对代码的含义进行解释,仅作为一个示例,让大家了解如何编译和运行 C 代码。

如果你已经安装好了linux系统的GCC 编译器,可以打开命令行并执行以下命令:

gcc hello.c

该命令使用 gcc 编译器将源文件 hello.c 编译成二进制代码。

运行此命令后,默认会在当前目录下生成一个编译产物文件 a.out(在 Windows 平台上为 a.exe)。执行该文件即可在屏幕上输出 Hello World

GCC 的 -o 参数(output 的缩写)可以用于指定编译产物的文件名。

gcc -o hello hello.c

此命令中的 -o hello 指定了编译产物的文件名为 hello(取代默认的 a.out)。编译后生成的可执行文件名为 hello,执行该文件也会得到相同的结果。

GCC 的 -std= 参数(standard 的缩写)可以指定编译时使用的 C 语言标准。

gcc -std=c99 hello.c

此命令指定按照 C99 标准进行编译。

注意,-std 后面需要用 = 连接参数,而不是像 -o 那样用空格,并且 = 前后也不能有多余的空格。

但如果你仅仅只想学习一下C语言的语法,那么不必执行前述这些东西,直接去在线编译网站即可:

image.png

但如果可以,我还是推荐你使用visual studio工具进行学习,因为它拥有智能提示、补全功能。

或者安装使用wsl,提前适应linux系统开发技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2271488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基层医联体医院患者历史检验检查数据的快速Python编程分析

​​​​​​​ 一、引言 1.1 研究背景与意义 在当今数字化医疗时代,医疗数据呈爆炸式增长,涵盖患者的基本信息、病史、检验检查结果、治疗方案等各个维度。这些海量且复杂的数据蕴含着巨大价值,为精准医疗决策提供了关键依据。通过对患者历史检验检查数据的深入对比分析…

智慧工地解决方案 1

建设背景与挑战 工地施工现场环境复杂&#xff0c;人员管理难度大&#xff0c;多工种交叉作业导致管理混乱&#xff0c;事故频发。传统管理方式难以实现科学、有效、集中式的管理&#xff0c;特别是在环境复杂、地点分散的情况下&#xff0c;监管困难&#xff0c;取证复杂。施…

笔上云世界微服务版

目录 一、项目背景 二、项目功能 一功能介绍 三、环境准备 • 需要开发的端口 • Mysql 导入数据库 ​编辑 • Redis ​编辑 • RabbitMQ ​编辑 在创建blog虚拟主机(方法如下) • Nacos • Nginx 四、前端部署 五、后端部署 六、测试计划操作 一功能测试 二…

SQL Server 数据库 忘记密码

1、先用windows 身份验证 连接 2、安全性--登录名 3、设置 身份验证 4、重启电脑 5、登录 登陆成功!!! ------------------------------------------------------------------ --1、查询登录账号信息 ------------------------------------------------------------------ -- …

windows安装并配置Maven

Maven官网下载 https://maven.apache.org 将下载好的解压到自己想要存放的路径中&#xff08;路径中不要有中文或者影响环境的字符&#xff09; 在此目录内新建一个名为repository的文件夹&#xff0c;此文件的目的是作为本地Maven的仓库来使用 配置环境变量 按下windows加r键…

Huginn - 构建代理、执行自动化任务

文章目录 一、关于 Huginn什么是Huginn&#xff1f;Huginn 功能加入Huginn展示 二、安装1、Docker2、本地安装3、开发 三、使用Huginn代理gems四、部署1、Heroku2、OpenShiftOpenShift 在线 3、在任何服务器上手动安装4、可选设置4.1 私人开发设置4.2 启用WeatherAgent4.3 禁用…

Android Glide判断当前运行环境是否为主线程的工具方法,Kotlin

Android Glide判断当前运行环境是否为主线程的工具方法&#xff0c;Kotlin private fun assertMainThread() {if (!isOnMainThread()) {throw IllegalArgumentException("You must call this method on the main thread");}}private fun isOnMainThread(): Boolean {…

Visual Point Cloud Forecasting enables Scalable Autonomous Driving——点云论文阅读(12)

此内容是论文总结,重点看思路!! 文章概述 这篇文章介绍了一个名为 ViDAR 的视觉点云预测框架,它通过预测历史视觉输入生成未来点云,作为自动驾驶的预训练任务。ViDAR 集成了语义、三维几何和时间动态信息,有效提升了感知、预测和规划等自动驾驶核心任务的性能。实验表明…

MacBook_Xcode_Swift雨燕

Swift Swift Swift Swift是苹果公司开发的现代化编程语言&#xff0c; 专为Apple平台设计。其简洁语法、类型安全、Optionals处理、Playgrounds交互式环境、泛型编程、协议与扩展、闭包功能、枚举与关联值、结构体与类的高效内存管理、异步编程的async/await语法、Swift Packa…

STM32完全学习——使用LIBJPEG库解码图片

一、有关配置 这个库的移植可以说是&#xff0c;很简单&#xff0c;直接使用CubMAX工具就可以帮我们生成移植好的代码&#xff0c;如果你想移植到其他平台&#xff0c;将CubMAX生成的那几个文件拷到你的工程里面就可以了。主要是这个如何使用起来&#xff0c;其实也不难&#…

验证码识别插件 - captcha-killer

验证码识别插件 - captcha-killer 简介 captcha-killer 是一款用于 Burpsuite 的验证码识别插件。它的主要功能是调用各种验证码识别接口&#xff0c;以便在进行渗透测试时能够自动识别和绕过验证码。这个插件本身并不直接进行验证码的识别&#xff0c;而是通过调用外部的 OC…

unity团结云下载项目

今天开plastic scm发现它云服务好像停了哈&#xff0c;在hub里下载云端项目也不会出现在项目列表里&#xff0c;之前也有发邮件说让提前迁移到团结云。打开云仓库会弹这个&#xff0c;大概就是plastic scm无法解析域名地址吧 研究了一下团结云咋使&#xff0c;官方手册看半天也…

【VUE】使用create-vue快速创建一个vue + vite +vue-route 等其他查看的工程

create-vue 简介 GitHub:https://github.com/vuejs/create-vue 创建的选项有多个,具体的可以看下方截图,当创建完成的时候可以发现工程中是自带vite的。 下面对其中的各种内容进行简单的说明 JSX (可以选择,但是我感觉没什么必要) 全称:JavaScript XML 允许你在 Java…

RIP配置实验

RIP配置实验 案例简介 天一公司下属三个分公司&#xff0c;属于不同的地区&#xff0c;三个公司之间用路由器连接&#xff0c;路由器名称分别为分别为 Router0、Router1、Router2&#xff0c;请把一公司的部门pc0,通过二公司路由器&#xff0c;连接三公司的部门pc1,公司之间通…

video.js视频播放上手

html案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>videojs视频播放</title> </head> <link href"https://cdnjs.cloudflare.com/ajax/libs/video.js/7.3.0/video-js.min.cs…

Introducing Optimization

Chapter6&#xff1a;Introducing Optimization 声明&#xff1a;本篇博客笔记来源于《Neural Networks from scratch in Python》&#xff0c;作者的youtube 其实关于神经网络的入门博主已经写过几篇了&#xff0c;这里就不再赘述&#xff0c;附上链接。 1.一文窥见神经网络 2…

解决Git中没有小绿勾与红叉叉的问题

一、检查自己的软件 必须安装Git和Tortoisegit&#xff08;也就是俗称的小乌龟&#xff09;这两个软件。 Git的下载地址&#xff1a; CNPM Binaries Mirrorhttps://registry.npmmirror.com/binary.html?pathgit-for-windows/ 寻找与自己电脑相配的软件版本就可以了。 Tor…

向量数据库技术

前言 这里有一些狗&#xff0c;熟悉犬类的朋友应该能很快区分出它们的品种&#xff0c;我们之所以能做到这一点&#xff0c;是因为我们会从不同的角度来观察它们的特征。 比如体型的大小&#xff0c;如果我们使用一个坐标轴来表示这个特征&#xff0c;这些狗将落在不同的坐标点…

算法攻略:顺序表的进阶之路——移除元素

题目如下&#xff1a; 思路&#xff1a; 双指针法 nums[src] val&#xff0c;srcnums[src] ! val&#xff0c;src的值赋值给dst&#xff0c;src和dst都 注&#xff1a; 1&#xff09;双指针法&#xff1a;只是抽象出了两个指向数组的变量&#xff0c;并不是真的指针。 2&#…

docker Error response from daemon

问题 Error response from daemon: Get "https://index.docker.io/v1/search?qnginx&n25": read tcp 192.168.50.233:54354->54.198.86.24:443: read: connection reset by peer Unable to find image redis:latest locally docker: Error response from d…