目录

前文列表

程序编译流程与 GCC 编译器

C 语言

C 语言是一种通用的、面向过程的高级编程语言。UNIX 操作系统,C 编译器,和几乎所有的 UNIX 应用程序都是用 C 语言编写的。

C 语言最早的原型是 ALGOL 60。

  • 1963 年,剑桥大学将其发展成为 CPL(Combined Programing Language)。
  • 1967 年,剑桥大学的 Matin Richards 对 CPL 语言进行了简化,产生了 BCPL 语言。
  • 1970 年,美国 AT&T 贝尔实验室(Bell Labs)的 Ken Thompson 将 BCPL 进行了修改,并取名叫做 B 语言,意思是提取 CPL 的精华(Boiling CPL down to its basic good features)。并用 B 语言写了第一个 UNIX 系统。
  • 1973 年,贝尔实验室的 Dennis Ritchie(D.M.RITCHIE)在 BCPL 和 B 语言的基础上设计出了一种新的语言,取 BCPL 中的第二个字母为名,这就是大名鼎鼎的 C 语言。
  • 随后不久,UNIX 的内核(Kernel)和应用程序全部用 C 语言改写,从此,C 语言成为 UNIX 环境下使用最广泛的主流编程语言。

C 语言的版本

  • K&R C:1978 年,Dennis Ritchie(丹尼斯·里奇,C 语言之父,UNIX 之父)和 Brian Kernighan(布莱恩·科尔尼干)合作推出了《The C Programming Language,C 程序设计语言》的第一版(按照惯例,经典著作一定有简称,该著作简称为 K&R),书末的参考指南(Reference Manual)一节给出了当时 C 语言的完整定义,成为那时 C 语言事实上的标准,人们称之为 K&R C。从这一年以后,C 语言被移植到了各种机型上,并受到了广泛的支持,使 C 语言在当时的软件开发中几乎一统天下。

  • C89(ANSI C):随着 C 语言在多个领域的推广、应用,一些新的特性不断被各种编译器实现并添加进来。于是,建立一个新的 “无歧义的、与具体平台无关的 C 语言定义” 成为越来越重要的事情。1983 年,ASC X3(ANSI 属下专门负责信息技术标准化的机构,现已改名为 INCITS。ANSI,全称 American National Standard Institute,美国国家标准协会)成立了一个专门的技术委员会 J11(J11 是委员会编号,全称是 X3J11),负责起草关于 C 语言的标准草案。1989 年,草案被 ANSI 正式通过成为美国国家标准,被称为 C89 标准。

  • C90(ISO C):随后,《The C Programming Language》第二版开始出版发行,书中内容根据 ANSI C(C89)进行了更新。1990 年,在 ISO/IEC JTC1/SC22/WG14(ISO/IEC 联合技术第 I 委员会第 22 分委员会第 14 工作组)的努力下,ISO 批准了 ANSI C 成为国际标准。于是 ISO C(又称为 C90)诞生了。除了标准文档在印刷编排上的某些细节不同外,ISO C(C90)和 ANSI C(C89)在技术上完全一样。

  • C95:之后,ISO 在 1994、1996 年 分别出版了 C90 的技术勘误文档,更正了一些印刷错误,并在1995 年通过了一份 C90 的技术补充,对 C90 进行了微小的扩充,经过扩充后的 ISO C 被称为 C95。

  • C99:1999 年,ANSI 和 ISO 又通过了最新版本的 C 语言标准和技术勘误文档,该标准被称为 C99。GCC 中指定此版本时所用参数有两种写法:

    • -std=c99
    • -std=iso9899:1999
  • C11:2011 年发布了当前最新的 C 语言标准为 C11,指 ISO 标准 ISO/IEC 9899:2011。此 C11 标准未完成之前的草案,被叫做 C1X。GCC 中指定此版本时所用参数有两种写法:

    • -std=c11
    • -std=iso9899:2011

ISO 的 C 语言标准,定义了对于 C 语言的两种实现:

  1. 支持 C 语言的所有库函数。
  2. 支持 C 语言的基本库函数(+ 各自版本对应的实现)。
  • 基本库函数包括:<float.h>,<limits.h>,<stdarg.h>,<stddef.h>
  • AMD1 对应的是:<iso646.h>
  • C99 对应的是:<stdbool.h>,<stdint.h>
  • C11 对应的是:<stdalign.h>,<stdnoreturn.h>

C 语言的特点

  • C 是一门中级语言。它把高级语言的数据结构、语句等特性与低级语言(汇编语言)的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。

  • C 是一门结构式语言。结构式语言的显著特点是代码及数据的分割化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。

  • C 语言功能齐全。具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。

  • C 语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件、三维、二维图形和动画,支持多种显示器和驱动器;

C 语言的优点

  • 既有高级语言的结构和编程环境,又有类似于低级语言(汇编语言)的系统资源操纵能力。目标代码的执行效率只比汇编低 10~20% ,比其他高级语言高,适合解决有实时要求的问题;

  • 有丰富的运算符、数据类型和表达式,对程序设计有良好的适应性;

  • 支持以函数为基础结构化程序设计、多文件构成及文件独立编译,适合大型复杂程序设计;

  • 语言简洁、紧凑,使用方便、灵活,书写形式自由;

  • 代码及可执行程序的可移植性好。

C 语言的缺点

  • C 语言它的最大的缺点就是,如果你的项目很复杂,大量的开发人员互相之间需要更新大段代码时,C 语言可能会使事情变得异常麻烦。因为 C 是在面向对象方法流行之前开发的,这大大降低了 C 语言复杂设计的可能性。但这不代表 C 语言做不了大项目,世界上有太多的经典都是用 C 语言完成的,只是说这里面的复杂度会更高。

  • 输入输出相对很多语言都较为复杂。对于字符串的处理,只能通过字符数组实现。绘图操作较为复杂;

  • C 语言的缺点主要表现在数据的封装性上,这一点使得 C 在数据的安全性上有很大缺陷,这也是 C 和 C++ 的一大区别;

  • C 语言的语法限制不太严格,对变量的类型约束不严格(弱类型语言),影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握;

  • 指针是 C 语言的一大特色,可以说是 C 语言优于其它高级语言的一个重要原因。就是因为它有指针,可以直接进行靠近硬件的操作,但是 C 的指针操作也给它带来了很多不安全的因素。C++ 在这方面做了很好的改进,在保留了指针操作的同时又增强了安全性。Java 取消了指针操作,提高了安全性;

  • 类型检查机制相对较弱、缺少支持代码重用的语言结构。

搭建编程环境

  • 操作系统:CentOS7
  • 编辑器:VIM
  • 编译器:GCC

安装 GCC

yum install gcc vim -y

查看 GCC 版本

$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)
Copyright 2015 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。

编程

#include <stdio.h>

void main(){
printf("Hello World");
}

编译

gcc hello.c -o hello.exe

NOTE:因为 Linux 下可执行文件的后缀仅仅是一种形式,所以可执行文件也可以不带后缀。

运行

./hello.exe

基本语法

C 程序的文件类型

  • .h:头文件,用于声明宏、变量、函数,定义类等
  • .c:C 程序源码文件
  • .cpp:C++ 程序源码文件

C 语言程序是由函数定义类型定义组成的。因此一个源文件就是一系列的函数和类型。每个函数都可以调用其他函数或调用自身(递归),可以使用任何已经声明的或内建(C 标准库)的数据类型。C 语言代码是从前往后依次执行的,所以你可以后定义,但必须先声明。你还可以调用其他库提供的函数,使用库中提供的数据类型,这也是 C 中多层级系统的复杂性不断增长的根源。

C 程序主要包括以下部分

  • Tokens(令牌):C 程序由各种令牌组成,令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。
printf("Hello, World! \n");

这五个令牌分别是:

printf
(
"Hello, World! \n"
)
;
  • 预处理器指令:由于预处理器执行的指令
  • 注释:使用 ///* ... */ 作为单行或多行注释。
  • 函数:完成特定任务的与语句、表达式的集合。
  • 语句、表达式:一行代码。表达式(Expression)总有值,而语句(Statement)不总有。
  • 标识符:自定义的变量、函数的命名标识,一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟若干个字母、下划线和数字(0-9)。大小写敏感,使用驼峰风格。
  • 关键字:C 中的保留字,这些保留字不能作为标识符。
  • 换行符:使用 ; 作为程序换行符(语句结束符),表明一个逻辑实体的结束。
  • 空格:只包含空格的行,被称为空白行,可能带有注释,C 编译器会完全忽略它。
#include <stdio.h>

int main()
{
/* 我的第一个 C 程序 */
printf("Hello, World! \n"); return 0;
}
  1. 程序的第一行 #include <stdio.h> 是预处理器指令,告诉 C 编译器在预处理过程中要包含 stdio.h 文件。
  2. 下一行 int main() 是主函数,程序从这里开始执行。
  3. 下一行 /*...*/ 是注释内容,在预处理过程会被忽略。
  4. 下一行 printf(...) 是 C 中的标准函数,会在屏幕上显示消息 “Hello, World!”。
  5. 下一行 return 0 终止 main() 函数,并返回值 0。

C 语言编程 — 基本语法的更多相关文章

  1. 个人c语言编程风格总结

    总结一下我个人的编程风格及这样做的原因吧,其实是为了给实验室写一个统一的C语言编程规范才写的.首先声明,我下面提到的编程规范,是自己给自己定的,不是c语言里面规定的. 一件事情,做成和做好中间可能隔了 ...

  2. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

  3. 第二章 C语言编程实践

    上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...

  4. 华为C语言编程规范

    DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd ...

  5. 采访:Go语言编程

    Go语言是由Google在2009年11月份公布的,它的目标是要应对软件开发所面临的最新挑战.Go语言特别被设计为快速(包括在编译时).支持多核的语言,并且兼顾了动态语言的简单性和静态类型语言的安全性 ...

  6. [C] 在 C 语言编程中实现动态数组对象

    对于习惯使用高级语言编程的人来说,使用 C 语言编程最头痛的问题之一就是在使用数组需要事先确定数组长度. C 语言本身不提供动态数组这种数据结构,本文将演示如何在 C 语言编程中实现一种对象来作为动态 ...

  7. Go语言编程 (许式伟 等 著)

    第1章 初识Go语言 1.1 语言简史 1.2 语言特性 1.2.1 自动垃圾回收 1.2.2 更丰富的内置类型 1.2.3 函数多返回值 1.2.4 错误处理 1.2.5 匿名函数和闭包 1.2.6 ...

  8. R语言编程艺术(5)R语言编程进阶

    本文对应<R语言编程艺术> 第14章:性能提升:速度和内存: 第15章:R与其他语言的接口: 第16章:R语言并行计算 ================================== ...

  9. 7款易上手C语言编程软件推荐

    C语言是一门历史很长的编程语言,其编译器和开发工具也多种多样,其开发工具包括编译器,现举几个开发工具供大家选择,当然也要根据自己的操作系统来选择适合自己的开发工具. 好多刚开始接触c语言的朋友都想知道 ...

  10. Linux C语言编程基本原理与实践

    Linux C语言编程基本原理与实践(2018-06-16 19:12:15) Linux C语言编程基本原理与实践 高效的学习带着目的性: 是什么 -> 干什么 -> 怎么用 重识C语言 ...

随机推荐

  1. SQLAlchemy详解

    一.SQLAlchemy介绍 SQLAlchemy 是 Python SQL 工具包和对象关系映射器,为应用程序开发人员提供 SQL 的全部功能和灵活性. SQLAlchemy支持SQLite.Pos ...

  2. OpenHarmony 3.2 Release新特性解读之驱动HCS

      OpenAtom OpenHarmony(以下简称"OpenHarmony")开源社区,在今年4月正式发布了OpenHarmony 3.2 Release版本,标准系统能力进一 ...

  3. 应用缺少POI数据,如何开发地点深度信息?

    用户在App里搜索某个地点时,并不满足单一的地点信息,希望得到更多可以帮助其做决策的深度信息.例如有打车出行需求的用户,在打车App里搜索地点时可以显示周边的地点,精确到某个路口,让用户可以自由选择合 ...

  4. Redis之父萨尔瓦多·桑菲利波又名安蒂雷斯

    萨尔瓦多·桑菲利波又名安蒂雷斯 个人博客连接 嗨,我是萨尔瓦多·桑菲利波,也被称为安提雷斯, 一位居住在卡塔尼亚的意大利计算机程序员. 我于7年1977月2020日出生在坎波贝洛迪利卡塔. 2022 ...

  5. ASP.NET 部署常见问题及解决方案

    ASP.NET 部署部署过程中常见问题及解决方案 Could not load file or assembly 'XXXXX' or one of its dependencies. Access ...

  6. 重新点亮linux 命令树————用户和用户组的配置文件[八]

    前言 简单整理一下 正文 首先看下vim /etc/passwd 这个东西. 可以看到这些就是我们的用户表. 刚才我们创建的user1就在末尾了. 那么下面有这个x:1001:1001 这个是什么意思 ...

  7. apache 服务器配置常用知识点合集

    前言 因为当年周围同学都在学php,最为简单的就是学php 好就业啊,写个一些php,最后放弃了,apache也看了两眼吧.下面是我使用有记录的,没有记录的我后面会补上. 正文 域名配置 1.取消 N ...

  8. python flashtext字符串快速替换,自然语言处理加速

    在自然语言处理当中,经常对数据集进行一些数据字符的替换,表情的替换,以便在tokenizer的时候不被识别成[unk],造成信息的缺失 常规方法使用python自带的replace方法实现,但数据量很 ...

  9. 力扣602(MySQL)-好友申请Ⅱ:谁有最多的好友(中等)

    题目: 在 Facebook 或者 Twitter 这样的社交应用中,人们经常会发好友申请也会收到其他人的好友申请. RequestAccepted 表: (requester_id, accepte ...

  10. 力扣27(java&python)-移除元素(简单)

    题目: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度. 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入 ...