C语言梦开始的地方

C语言的发展历史

C语言由贝尔实验室的丹尼斯·里奇(Dennis Ritchie)于 1972年 开发。它的前身是B语言——由肯·汤普森基于BCPL为编写UNIX系统而创造,但B语言是解释型、不可移植。里奇在B的基础上加入类型系统,发展出了更安全、可移植的C,并用它重写了UNIX操作系统。

时间 事件
1978年 里奇与柯林汉出版《The C Programming Language》(K&R C),K&R成为事实标准
1989年 ANSI发布正式标准 C89(同年被ISO采纳为C90)
1999年 C99 —— 加入 long long、// 行注释、可变长数组等
2011年 C11 —— 加入多线程与原子操作支持
2023年 C23 —— 最新标准,引入 nullptr 等新特性

虽然如今C语言在日常的工程是已经逐渐退出舞台了,但是C语言仍然是计算机语言中的丰碑有许多入门到大牛的程序员们都喜欢叫C语言为计算机的“九阳真经”。
C语言虽然已经在计算机开发中逐渐退出了舞台但是它里面的思想还是影响着后面许多的语言比如:C++、Java、Python、Rust等,不过目前嵌入式开发和系统编程的核心语言

C语言的三大结构

C语言的三大结构:顺序,选择和循环,不仅是C语言是这样的目前常见的语言都是如此。
接下来就让我们一起来看看这三大结构是什么样的吧

在这里插入图片描述

顺序结构

顺序结构:一件事情从头到尾中间的一直干下去,在代码中的表现就是程序从上到下、从左到右逐条执行,没有跳转、没有分支。

#include<stdio.h>

int main()
{
    return 0;
}

这个程序就是顺序结构并且也是最简单的C语言程序,看到这里有人可能会产生疑惑说为什么这里是int main() 而不是 void main() 或者是这样的 int main(int argc,char* argv[])

  • 我们先说一下int 和 void 的区别,有的时候我们看到书上是 void main(),根本原因是当时的C语言还说main还是结束必须有返回值,是后面规定了必须有返回值,这是因为有了返回值我们才能知道程序问题有可能出现在哪里并且如今的编译器写void main()会直接报错
  • 带参和不带参的区别,这里的参数是指的命令行参数比如(Windows的cmd,Linux的shell命令)都可以被C语言程序通过带参的方式获取,不带参就是不获取这些
    在日常编写程序是官方更推荐int main()的形式如果说当你需要获取参数时就用int main(int argc, char *argv[])

选择结构

选择结构:根据条件判断,在多个候选执行路径中选一条执行。

int main()
{
    int score = 0;
    scanf("%d",&score);
    
    if(score >= 60)
    {
        printf("passed\n");
    }
    else {
        printf("failed\n");
    }
    return 0;
}

上述代码就是选择,使用了C语言的输入scanf,输出printf和判断语句 if……else
下面我们通过表格的方式给大家展示一下:

格式 含义
%d 有符号十进制整数 (int)
%ld 长整型 (long)
%lld 长长整型 (long long)
%f 浮点数 (float)
%lf 双精度 (double)
%c 单个字符
%s 字符串
%u 无符号整数
%% 输出一个百分号

除了最后的 %% 是输出独占的,其他输入输出都可以使用,除此之外输入输出还有注意事项
scanf注意事项

  1. 必须用 & 取地址(字符串数组名除外),传给指针,否则崩溃或未定义行为。
  2. 格式串末尾不要加 \n。scanf 本身会跳过前导空白;结尾的 \n 会让它继续吞空白并等待下一个非空白字符,导致控制台"卡住"等你多输入一次。
  3. 返回值为成功读入的项数,可用它判断输入是否失败:if(scanf(“%d”,&a)!=1) {…}。
  4. %s 无法读带空格的字符串,读 hello world 只会得 hello;要整行请用 fgets。
  5. %s、%d 不检查边界/溢出,恶意的超长输入可能造成缓冲区溢出。
  6. %c 不接受空格跳过,会读入空白字符(含上次的回车),需要时在前面加空格:scanf(" %c",&c);。

printf注意事项

  • 普通字符原样输出,格式说明符与参数顺序、个数、类型必须匹配。
  • %d 前的 \n 只是换行,不属于格式说明。
  • 函数原型:int printf(const char *fmt, …);

if……else 我们在后续讲到选择语句时再来说一下。

循环结构

循环结构:重复执行一段代码,直到条件不满足为止。

int main()
{
    int n = 0;
    int total = 0;
    //1到10的和
    while(n < 10)
    {
        n++;
        total += n;
    }

    printf("%d\n",total);
    return 0;
}

同样这里的while我们后续在讲到循环语句时在来说一下

通过上述对顺序,选择和循环的了解

C语言的关键字

关键字 说明 关键字 说明 关键字 说明 关键字 说明
char 字符型 short 短整型 int 整型 long 长整型
float 单精度 double 双精度 signed 有符号 unsigned 无符号
void 空类型 _Bool 布尔(C99) auto 默认存储 register 寄存器
static 静态 extern 外部声明 typedef 类型重命名 const 只读
volatile 易变(不缓存) struct 结构体 union 联合体 enum 枚举
if 条件判断 else 否则 for 循环 while 前测循环
do 后测循环 switch 多分支 case 分支标签 default 默认分支
break 跳出循环 continue 继续循环 goto 无条件跳转 return 返回
sizeof 求字节数 restrict 指针限定(C99) inline 建议内联(C99) _Complex 复数(C99)
_Imaginary 虚数(C99)

本章节我们了解C语言的发展史和C语言的三大结构以及关键字体系
下一章节我们将充分的了解C语言三大结构和部分常见关键字的使用
本章完

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐