• 初识C语言



    01 C语言的诞生

            1967年,26岁的丹尼斯·里奇进入贝尔实验室开发Unix,并于1969年圣诞节前推出第一个试运行版本,但由于这个时候的Unix是汇编语言写的,移植性非常差,想要让Unix运行在不同型号的机器上,就得针对每个型号的机器重写一遍操作系统,这显然是一个不可能完成的任务。

    C语言和Unix之父---丹尼斯·里奇

            为了提高通用性和开发效率,丹尼斯·里奇决定发明一种新的编程语言 ---- C语言。紧接着,丹尼斯·里奇就用C语言改写了Unix操作系统Unix上的C语言编译器,他的同事汤姆森则使用C语言重写了Unix,使它成为一种通用性强、移植简单的操作系统,从此开创了计算机编程史上的新篇章,C语言也成为了操作系统的专用语言。


    02 什么是C语言

    对于大部分程序员来说,C语言是学习编程的第一课,C语言除了能让你了解编程的相关该概念,还能够让你明白程序的运行原理,比如:计算机的各个部件是如何交互的,程序在内存中是一个怎样的状态,操作系统和用户程序之间的爱恨情仇。

            C语言是一种用途广泛、功能强大、使用灵活的过程性编程语言(不同于面向过程的语言如C++、Java),既可用于编写应用软件,又可用于编写系统软件;

            C语言属于编译语言,编译语言,源程序需要经过编译器把代码全部翻译为机器语言0-1二进制的可执行程序,一旦翻译以后,只要源程序不变,就不需要再次进行编译;不同于Python这类解释型语言,解释型语言则是将源程序的一条一条的代码翻译成机器语言后立即执行,翻译一条执行一条,翻译一次只能执行一次,当第二次运行时就要重新翻译,所以效率不高。

            C语言有以下特点:①语言简洁、紧凑,使用方便、灵活;②运算符丰富;③数据类型丰富;④具有结构化的控制语句;⑤语法限制不太严格;⑥允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作;⑦编写的程序可移植性好;⑧生成目标代码质量高,程序执行效率高;因为贴近底层且执行效率极高故C语言成为了计算机开发人员的一项基本功。

            C语言可以说是有史以来最为重要的编程语言,更是入门级语言,学习C语言是了解内存布局的最简单、最直接、最有效的途径。C语言简直是为内存而生的,它比任何一门语言都贴近内存。所熟知的PHP、Python等都是用C语言开发的。


    03 C标准

    C89 和 C99 标准
            到了80年代,C语言越来越流行,广泛被业界使用,为统一C语言版本,1983年美国国家标准局(American Nation Standards Institute,简称 ANSI)成立委员会专门制定C语言标准,1989年C语言标准被批准,被称为 ANSI X3.159-1989 " Programing Language C" 。这个版本的C语言通常被称为 ANSI C,又由于这个版本是在89年完成指定的,因此也称 C89 。后来 ANSI 把这个标准提交到 ISO(国际化标准组织),1990年被ISO采纳为国际标准,称为 ISO C ,又因为是1990年发布的,所以也称 C90,ANSI C(C89)和 ISO C(C90)内容基本相同,主要格式组织不一样,所以这两个标准的内容是一样的。

    C99 标准
            在 ANSI C 标准确立之后, C 语言的规范在很长一段时间内都没有大的变动。1995年 C 程序设计语言工作组对 C 语言进行了一些修改,增加了新的关键字,编写了新的库,取消了原有的限制,并于1999年形成新的标准 ISO / IEC 9899:1999标准,通常被成为C99

    C11 标准
            C11标准由国际标准化组织( ISO )和国际电工委员会( IEC )旗下的 C 语言标准委员会于2011年底正式发布,C11标准主要增加了以下内容:
    ●增加了安全函数,例如 gets _s0、 fopen _s0等;
    ●增加了< threads . h >头文件以支持多线程;
    ●增加了< uchar . h >头文件以支持 Unicode 字符集;以及其它一些细节。

    现在的很多教程或教材都是基于C89编写的,后来的C99、C11新增的特性并不多,只是在“打补丁”。


    04 Hello World

    • 接下来直接上手进行我们的第一个C语言程序:输出 Hello World
    #include           // 编译预处理指令(头文件)
    int main()					// 定义主函数 int为返回值类型
    {                           // 花括号{}内的是函数体
    	printf("Hello World);   // printformat 格式化输出
    	return 0;               // 返回0 代表函数执行完毕
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    程序分析:

    • main是函数的名字,表示“主函数”,每一个C语言程序都必须有一个main函数;
    • main前面的 int 表示此函数的返回值类型为 int 即整形;
    • return 0 ; 的作用是当main函数执行结束前将整数0作为函数值返回到调用处;
    • 函数体由花括号 { } 括起来;
    • 带括号的语句称为函数(function) ,如 printf() puts() 都是函数;

    还可以这样:

    #include           // 编译预处理指令(头文件)
    int main()					// 定义主函数 int为返回值类型
    {                           // 花括号{}内的是函数体
    	puts("Hello World);     // 输出字符串
    	return 0;               // 返回0 代表函数执行完毕
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运行后出现以下:
    在这里插入图片描述

    必须使用英文半角输入法,尤其是标点符号!

    #include                  //编译预处理
    int main()                         //主函数
    {
    	int a, b, sum;                 //声明,定义a,b,sum为整形变量
    	a = 123;                       //给a赋值,已经声明过所以前面不用加
    	b = 123;                       //给b赋值
    	sum = a + b;                   //把a和b的值累加赋给sum
    	printf("%d + %d = %d",a,b,sum);//%d为格式占位符 传递后面变量的值
    	return 0;                      //返回0 函数执行结束
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    05 main函数和自定义函数

    • 求两个整数的较大者
    #include               //头文件
    int main()                      //主函数
    {
    	int max(int x, int y);     //声明一个自定义函数
    	int a=0, b=0, c;           //声明a,b,c 因为我用的VS2022所以需要初始化,不然会报错
    	scanf_s("%d %d", &a, &b);  //scanformat格式化扫描输入 &a为a的地址
    	c = max(a, b);             //调用自定义函数max来比较出大小
    	printf("max=%d", c);       //输出 %d 为占位符
    	return 0;                  //主函数执行结束
    }
    
    int max(int x, int y)          //自定义函数 括号内的为形参
    {
    	int z;                     //声明z来接收最大值
    	if (x > y)z = x;           //如果x>y则把x赋给z
    	else z = y;                //否则y赋给z
    	return (z);                //返回z的值到调用这个函数的地方
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 在main主函数里声明自定义函数(声明就是先告诉程序有这个函数,不要报错,继续执行到调用这个函数时,程序会自动去找到定义的部分)
    • 自定义函数 int max( int x , int y ) 最前面的 int 是这个函数的返回值类型,括号里的 int x 和 int y 是声明的形参,就是开辟了一个内存空间占位置,等待数值传递进来;
    • scanf 是 scan formar 格式化扫描,能够读取用户输入的数据,在VS2022里面用这个会报错,用 scanf_s 代替scanf,且扫描的参数需要初始化;
    • “ %d ” 是格式占位符,含义是“以十进制整数的形式输出”
    • “ & ” 是地址符,“ &a ” 含义是“ 变量a的地址 ”,就和形参一样,先告诉程序这个位置会有读取的数值传递进来,先声明占位。

    06 C语言的结构

    在这里插入图片描述

    • 一个程序由一个或多个源程序文件组成;

      • 一个源程序文件包括三个部分:
        • 预处理指令,如 #include ,里面有写好的库函数,printf、puts等;
        • 全局声明,在函数外的声明,放在main主函数之前;
        • 函数定义,如主函数main和自定义函数max;
    • 函数是C程序的主要组成部分;

      • 一个C语言程序必须包含一个main函数 (有且仅有一个);
    • 一个函数包括两个部分:

    • 函数首部:int max ( int x, int y ) ; int main( void );

    • 函数体:最外层花括号内的部分;

      • 声明部分,int a,b,c;
      • 执行部分,若干语句组成函数操作;
    • 程序总是从main函数开始执行的,其他自定义函数也在main函数种被调用执行;

    • 每个数据声明和和语句的最后必须有一个分号;

    • C语言本身不提供输入输出语句,输入输出的操作是由#include里的库函数scanf和printf来完成的;

    • 好的程序应该包含注释,增加程序可读性;

    什么是头文件?
            #include 就是一个头文件,C语言开发者们编写了很多常用的函数,分门别类的放在了不同的文件,这些文件就称为头文件(header file),每个头文件中都包含了若干个功能类似的函数,调用某个函数时,要引入对应的头文件,否则编译器就找不到函数。
            引入头文件用#include命令,并将文件名放在<>中,#include和< >之间可以有空格;头文件以.h为后缀,而C语言代码文件以.c为后缀,它们都是文本文件,没有本质上的区别,#include命令的作用也仅仅只是将头文件中的文本复制到当前文件,然后和当前文件一起编译。

    较早的C语言标准库包含了15个头文件,stdio.h 和 stdlib.h 就是最常用的两个;
    stdiostandard input output 的缩写,stdio.h 为“标准输入输出文件”,包含的函数大多都和输入输出有关;
    stdlibstandard library 的缩写, stdlib.h 为“标准库文件”,包含的函数比较杂乱,多是一些通用工具型函数,如 system();


    07 运行C程序的步骤和方法

    在这里插入图片描述


    08 带颜色的C语言程序

            C语言不总是白底黑字的,也可以是彩色的,可以通过调用 windows.h 头文件下的 SetConsoleTextAttribute 函数来改变文字和背景的颜色,调用形式为:

    SetConsoleTextAttribute ( HANDLE hConsoleOutput, WORD wAttributes );
    
    • 1
    • hConsoleOutput 表示控制台缓冲区句柄,可以通过 (GetStdHandle(STD_OUTPUT_HANDLE) 来获得;
    • wAttributes 表示文字颜色和背景颜色;
    • WORD 在 windows.h 中定义,等同于 unsigned short ,使用低4位代表文字颜色,高4位代表背景颜色,所以取值为十六进制XX,可以随意组合;

    0 ~ F 分别代表的颜色如下:

     0 = 黑色   4 = 淡红   8 = 灰色   C = 红色
     1 = 淡蓝   5 = 紫色   9 = 蓝色   D = 淡紫
     2 = 淡绿   6 = 黄色   A = 绿色   E = 淡黄
     3 = 湖蓝   7 = 白色   B = 淡绿   F = 亮白
    
    • 1
    • 2
    • 3
    • 4

    例如:将背景设为淡绿色,文字颜色设为红色:

    #include  
    #include
    
    int main()
    {
    	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    	SetConsoleTextAttribute(hConsole, 0x2c);//0x代表十六进制 2是淡绿背景,c是红色字体
    	puts("I love C code");
    	SetConsoleTextAttribute(hConsole, 5);//将文字设为紫色
    	puts("I love Chengdu");
    	SetConsoleTextAttribute(hConsole, 0xe);//将文字设为淡黄
    	printf("!!!");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    09 带界面的C语言程序

            C语言不仅可以编写黑色的控制台程序,还可以编写带界面的Windows程序(GUI程序):

    #include
    
    int WINAPI WinMain(
    	HINSTANCE hInstance,
    	HINSTANCE hPrevInstance,
    	LPSTR lpCmdLine,
    	int nCmdShow
    ) {
    	int nSelect = MessageBox(NULL, "Hello World!", "This is C Program", MB_OKCANCEL | MB_ICONEXCLAMATION);
    	return 0;
    }
    // 不需要看懂,只是作为展示
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    输出:
    在这里插入图片描述

    如果运行报错:const char *“ 类型的实参与 “LPCWSTR“ 类型的形参不兼容

  • 相关阅读:
    数据库基本概念与安装MySQL数据库
    33. 对 BFC 的理解, 如何创建 BFC?
    【宝塔安装教程】2分钟装好面板,一键管理服务器
    pinyin-match选择器拼音快速检索目标
    Python3,区区5行代码,让黑白老照片变成华丽的彩色照,被吸粉了。
    2386. 找出数组的第 K 大和 (每日一难phase2-day2)
    云计算中的关键技术——虚拟化
    【SpringCloud】微服务技术栈入门2 - Nacos框架与Feign
    面试准备2022-08
    笙默考试管理系统-MyExamTest----codemirror(41)
  • 原文地址:https://blog.csdn.net/Lov1_BYS/article/details/127103937