C语言: C语言概述、 数据类型、常量、变量

计算机基础

计算机的组成

计算机组成

  • 计算机:能进行计算以及逻辑处理的设备

  • 硬件:组成计算机的物理部件。(内存条、CPU、硬盘..)

  • 软件:计算机中运行的程序和数据。

开发中对于硬件的认知:硬件包括电子设备、单片机、集成电路和嵌入式系统。

开发中对于软件的认知:软件分为系统软件(OS)、应用软件和编程工具(编译器)

计算机的六大部件
  • 中央处理器(CPU):控制 + 计算

  • 内存:临时存储运行时的数据。

  • 输入设备:向计算机输入数据(键盘、鼠标、扫码枪)

  • 输出设备:将计算机数据进行输出(显示器、打印机)

  • 外存储器:永久存储数据(硬盘)

  • 网络:数据传输与通信

计算机的工作原理
  • 存储程序:程序和数据存储在内存中

  • 程序控制:CPU按指令顺序执行

计算机的语法
  • 机器语言:二进制代码,直接控制硬件

  • 汇编语言:助记符形式,需要汇编器翻译

  • 高级语言:C/C++,Java,Python,PHP,C#,GO

C语言简史与特点

C语言的起源

  • 其前身是B语言;

  • B语言是美国贝尔实验室的 Ken Thompson(肯·汤普森)于1969年开发出来的,并且

  • 用B语言编写了初版的UNIX系统

  • 1972年美国贝尔实验室的Dennis Ritchie(丹尼斯·M·里奇)在B语言基础上开发的C语

  • 言.C语言提供了丰富的数据类型和标识符,使得程序的编写变得非常高效和方便。

  • 1973年初,C语言的主体完成。汤普森和里奇迫不及待地开始用它完全重写了UNIX。

C语言的标准

为了C语言健康发展下去,很多有识之士及美国国家标准协会(ANSI)于1982年成立了一个委员会以确定C语言的标准。

  • 1989 ANSI 发布了第一个完整的C语言标准,即C89。不过人们习惯性的称为 “ANSI C”

  • 1990年ISO(国际标准化组织一字不改的采纳了 C89,官方给出的名称为 ISO C90) 。

  • 1999年,C语言标准经过了一次修正和完善后,ISO发布了新版的C语言标准,简称”C99”。

  • 2018年6月份发布的 “C18”GNU C 标准 (标准C的扩展) ,进一步增强了语言的稳定性

  • 和功能性。

  • 在2011年12月8日,ISO又正式发布了新的标准,称为ISO/IEC9899:2011,简称为“C11”。

  • “C23”是最新的标准,预计将进一步扩展C语言的功能和性能。

  • 应用于Linux 系统,当然Linux也支持标准C,因为标准C是跨平台的。

嵌入式开发就是针对Linux系统的开发,而Linux系统是使用C语言开发的,所以从事嵌入式开发要使用C语言。

C语言特点

  • 简洁高效,支持底层硬件操作

  • 可移植性强,适合结构化编程

  • 生成代码质量高,执行速度快

开发的三个步骤

① 编辑:编写源代码(.c文件,程序员完成)

② 编译:将源代码文件转换为可执行的文件(编译器完成)

③ 运行:执行程序(操作系统加载)


C语言程序的编译过程

注意:本章节只是做一个简单的讲解,后续在深入!

上面提到的编译,实际上是分为了四个步骤:

  1. 预处理:处理宏和头文件以及注释等。

  2. 编译: 生成汇编代码

  3. 汇编:转换为机器码/二进制代码

  4. 链接:合并库文件和目标文件(二进制代码)

 测试代码:

// 头文件包含 预处理的时候,会将stdio.h中的代码全部拷贝到当前文件
#include <stdio.h>
// 宏定义
#define R 2
#define PI 3.14
int main()
{
printf("hello world!\n");
// 计算圆的面积
double area = PI * R * R; // 宏展开,double area = 3.14 * 2 * 2
printf("%f\n", area);
}

        

编译的命令

编译步骤命令文件类型说明
预处理gcc -E *.c -o *.i*.c → *.i生成的是C代码(文本)
编译gcc -S *.c -o *.s*.i → *.s生成的是汇编代码(文本)
汇编gcc -c *.c -o *.o*.s → *.o生成的是二进制代码(文本)
链接gcc *.c -o *生成的是二进制代码

C语言的基本结构

一个简单的C语言程序

功能:要求在控制台输出“hello world!”

代码:

/*********************************************************************
****
> File Name: demo01.c> Author: wu
> Description:
> Created Time: 2025年07月08日 星期二 10时34分35秒
**********************************************************************
**/
#include <stdio.h>
    // 主函数:一个.c文件只能有一个main函数,这个函数是程序的入口
int main()
{
    // 向控制台输出hello world!
    printf("hello world!\n");
    return 0;
}

程序结构分析:

  • 注释:解释代码逻辑,写给程序员自己看,预处理阶段会被删除。

  • 预处理指令:程序中包含的某一文件内容( #include <stdio.h>

  • 主函数: main函数是程序唯一的入口,一个文件中最多有1个,这个函数不能被其他函数调用,这是一个自动执行的函数,系统是通过这个函数的指针进行访问的。

  • 关于函数:

    • 函数头:(函数首部或者函数说明)

说明函数类型,函数头由函数名和形参列表构成。

  • 函数体:

包括变量说明和语句执行部分。

  • 函数调用语句:比如:printf()

 

C语言编程规范要求

C语言在编程的时候,需要遵循如下规范:

  • 常用的缩进格式(一般缩进2~4个字符,推荐缩进4个字符,我们Vim配置的是缩进4个字符,也就是一个 Tab键 )

  • 要有足够的注释(添加必要的注释,使代码更好理解)

  • 要有合适的空行(一般预处理指令和函数之间,函数和函数之间,全局变量和函数之间...,加空行提高代码可读性,使代码结构清晰)

/*****************************************************************
********
> File Name: demo02.c
> Author: wu
> Description:
> Created Time: 2025年07月08日 星期二 11时02分45秒******************************************************************
******/
#include <stdio.h>
#include <stdlib.h>
#define PI 3.14
#define R 2
int fun()
{
	printf("A\n");
}
int main(int argc,char *argv[])
{
	printf("hello world!\n");
	fun();
	return 0;
}

  • {}对齐(C和C++ { } 都需要独占一行,千万不要受Java影响)

 Java

int fun() {
...
}

C/C++

int fun()
{
...
}

  • 函数体内采用分层缩进和模块化的书写方式

int fun()
{
	if(..)
	{
		for(..)
		{
			printf("hello\n");
		}
	}
	if(..)
	{
		for(..)
		{
			printf("hello\n");
		}
	}
}
  • 不把多条语句写在程序的同一行上(最好的区分是,不要在同一行连续出现多个;,for循环( ;; )除外)

int main()
{
	// 错误写法(不影响编译,但是影响阅读体验)
	printf("hello"); 
    printf("hello"); 
    printf("hello");
	// 错误写法(不影响编译,但是影响阅读体验)
	int a = 10; 
    int b = 20;
	// 正确写法
	for (;;)
	{
		...
	}
}
  • 标识符命名要见名知意。

int main()
{
	// 创建3个变量,用来存储年龄、身高、体重
	// 错误演示(不影响编译,但是影响阅读体验)
	int a = 21;
	int b = 168;
    int c = 190;
	// 正确演示
	int age = 21;
	int height = 168;
	int weight = 190;
}

C语言程序的设计特点

  • C语言程序在设计的时候,需要注意以下细节:

  • C程序有一个或多个函数组成,但有且仅有一个main函数;这个函数是程序的入口函数,可以置于任意位置,建议放在所有函数的最下面。

  • 程序中可以有预处理指令(#include、#define),预处理指令通常放在程序的最前面。

  • 每个语句以分号结尾:(注意: 预处理 , 函数头,函数分支语句while和for语句 后面不能添加分号,否则会报错)

  • 函数体由一对 {}括起来,函数的{} 不能省略。

  • 包含在 /*..*/内,或者//..后面的文本为注释内容,在预处理阶段删除。

  • 一行可以写多个语句,一个语句可以写在多行上。

int main()
{
// 一行可以写多个语句
int a, b, c;
// 一个语句写在多行上
    while(1)
    {
    ...
    }
}
// 格式化笔记中的代码:shift + tab

C语言中的注释

在C语言中,注释一般分为两类:单行注释多行注释

注释的作用:给代码添加解释说明性文字,提升代码的可读性,注释本身不参与编译,在预处理阶段会被删除。我们同时也可以使用注释屏蔽掉暂时不需要的代码。

单行注释

说明:单行注释使用双斜杠//..表示。我们一般用于变量、常量、函数调用语句等。

语法:

// 需要注释的内容

范例:

// 预处理指令,引入系统的标准输入输出库
#include <stdio.h>

int main()
{
	// 向控制台打印输出 hello world!
	printf("hell world!\n");
	return 0;
}

多行注释

说明:多行注释使用双斜杠星花/*..*/表示。它可以占用一行,也可以占用多行,但不能嵌套。我们一般用于函数,文件头说明等。

语法:

/* 要注释的内容 */
/*
	要注释
	的内容
*/

范例:

/*
	主函数
*/
int main()
{
	...
}

注意:由多行注释衍生出一种更为细致的注释,我们称之为文档注释

范例:

/**
	* 主函数
	* @author 开发者
	* @param 参数1 说明
	* @param 参数2 说明
	* @return 返回值
	*/
int main()
{
	...
}

数据类型

定义

数据类型其实就是固定大小内存的别名,并且描述了一个变量存放什么类型的数据。简单来说,就是组织和操作数据。

数据:计算机需要处理的数据(数字、字符串、文字、符号、图片、音视频等)

  • 数据类型不仅帮助我们组织和操作数据,好决定了程序如何有效的利用内存。

  • 了解数据类型的内存需求是理解计算机管理和操作数据的关键。

tips:程序运行需要在内存中

数据类型分类和计算方法

数据类型分类(重点)
  • 基本类型(C语音内置)

    • 数值类型

      • 整型(整数)

        • 短整型:short(short int缩写)

        • 基本型:int(使用频率最高)

        • 长整型:long(long int缩写)

        • 长长整型:long long(long long int缩写,C99新增)

      • 浮点型(小数、实数、实型)

        • 单精度浮点型:float

        • 双精度浮点型:double

        • 长双精度型:long double(C99新增)

    • 字符型:char

  • 构造类型(C语音提供语法,用户自定义)

    • 结构体:struct

    • 联合体/共用体:union

    • 枚举类型:enum

  • 指针类型

  • 空类型:void(C语音内置)

数据类型在内存中的大小(重点)
序号数据类型中文说明大小(字节)
1short(short int)短整型2
2int基本整型4
3long(long int)长整型4(32位系统)/8(64位系统)
4long long(long long int)长长整型8
5float单精度浮点型4
6double双精度浮点型8
7char字符型1
8bool(Bool,C99新增)布尔型,true-真,false-假bool:1 , true(1):4,flase(0):4

C/C++ 数据类型范围

数据类型取值范围(十进制)
char-128 至 127
unsigned char0 至 255
short-32,768 至 32,767
unsigned short0 至 65,535
int-2,147,483,648 至 2,147,483,647
unsigned int0 至 4,294,967,295
long-2,147,483,648 至 2,147,483,647(32 位系统)
unsigned long0 至 4,294,967,295(32 位系统)
long long-9,223,372,036,854,775,808 至 9,223,372,036,854,775,807
unsigned long long0 至 18,446,744,073,709,551,615
float约 ±1.18×10⁻³⁸ 至 ±3.40×10³⁸(精度为 6-7 位有效数字)
double约 ±2.23×10⁻³⁰⁸ 至 ±1.80×10³⁰⁸(精度为 15-16 位有效数字)

小贴士:

获取某个数据类型或者变量所占的字节数,使用sizeof运算符:sizeof(某个数据类型或者变量名)

 printf("true size:%d\n", sizeof(true)); // trus size:4 解释:true本身就是int类型的1,所以占4个字节
 printf("bool size:%d\n", sizeof(bool)); // bool size:1 解释:占1个字

案例:

/*********************************************************************
****
	> File Name: demo03.c
	> Author: wu
	> Description:
	> Created Time: 2025年07月08日 星期二 15时14分13秒
************************************************************************/
#include <stdio.h>
int main(int argc,char *argv[])
{
	// 计算数据类型或者变量的字节大小,通过sizeof运算符
	printf("long long 的大小是%d个字节\n", 	sizeof(long long)); // %d 表
示10进制整数
	printf("long 的大小是%d个字节\n",sizeof(long));
	printf("long double的大小是%d个字节\n",sizeof(long double));
	return 0;
}

 运行结果:

 

总结:

① 数据类型在内存中所占的字节数跟C语言的编译系统有关。

② 计算某个数据类型所占字节数可以用sizeof运算符。

③ 布尔类型要添加 #include <stdbool.h> ,大家也可以直接使用int类型的0和1来表示布尔类型。

常量

在C语音中,数据的基本表现形式是常量和变量。不管是变量还是常量,都是需要在neicun中申请一块空间,用于数据的存放

定义:在程序执行过程中其值不可改变的量,称之为常量

分类:int、float、double、char、符号常量(宏定义)

整型常量

  • 整型常量可以用十进制、八进制、十六进制三种形式表示

    • 十进制常量:由数字0~9构成,没有前缀,不能以0位开头。举例:

99,218 //正确
0	   //正确
09	   //错误,不能以0开头

        

  • 八进制常量:由数字0~7构成,以0为前缀,不能表示小数。举例:

023,077 //正确
00       //正确
099		//错误
  • 十六进制常量:由数字0 ~ 9、字母a ~ f/A ~ F构成,以0x/0X为前缀,不能表示小数。举例:

0xffffff  //正确
0x55	//正确
0x0		//正确

注意:

整型常量中的长整型数据可用L或者1作为后缀,举例:

 long num = 123L

整型常量的分类

  • 有符号与无符号基本整型常量(int)

    • 有符号表示范围:负数+0+正数,默认写的都是有符号

    • 无符号表示范围:0+正数,内存中所有负数的位置都用了表示整数,此时它的正数范围超过有符号正数范围

  • 有符号与无符号长整型常量(long)

  • 有符号与无符号短整型常量(short)

  • 整型常量的表示:

    • 十进制常量:由数字0~9以及+ -构成,没有前缀,不能以0位开头

    • 八进制常量:由数字0~7以及+ -构成,以0为前缀,不能表示小数

    • 十六进制常量:由数字0 ~ 9、字母a ~ f/A ~ F构成,以0x/0X为前缀,不能表示小数。

浮点型常量

C语音中浮点数就是平常说的小数(实数),有两种表现形式

  • 十进制小数:如:0.123,-12.1,1.123F(float类型的常量,需要跟上f/F)

  • 指数形式(科学计数法):

    • 正数表示:如十进制小数1234.5de指数表示就是1.2345*10^3,也可以表示为{1.2345e3}

    • 负数表示:如十进制小数0.012指数表示就是1.2*10^{-2},也可以表示为1.2e-2

注意:

  1. 在符号e的签名必须要有数字

  2. 在符号e的后面必须为整数,不能是带有小数点的实数型

  3. 实型常量的后缀用F/f表示单精度型

字符型常量

``括起来的一个字符,如'a' ' A' '4' '_'等,比如 '刘'就不是字符,一个汉字所占的字节数据超过1个字符。中文符号当成汉字理解。英文输入法下输入的字母,数字,符号都是单字符

转义字符常量:以反斜杠\开头的字符序列,表示控制以及不可见字符。如:

字符形式中文含义ASCⅡ码
\n换行10
\r回车13
\0空字符0
\t水平制表符9

注意:

printf("%s","hello world!\n");
printf("hello world!\n"); // 等价于上面写法

使用man ascii可以查看所有ASCII码

字符串常量

说明:在C语言中,支持字符串常量,不支持字符串变量。字符串变量需要使用字符数组或者字符指针实现。

  • 用一对双引号""括起来的一个字符序列,如:

"How do you do?"
"hello world!"
"12"
"true"
"12.35"

  • 可以使用print输出一个字符序列,如:

printf("%s","hello world!\n");
printf("hello world!\n"); // 等价于上面写法

注意

字符常量'a'与字符串常量"a"的区别:

系统自动为字符串常量加上结尾的 \0 ,使所占内存单元多一个,单字符常量的长度不变,可用sizeof()运算符来测量。

符号常量

说明:一般通过宏定义,在预处理的时候替换成具体的常量

定义一个标识符来代表一个常量,如:用PI表示圆周率π(3.1415926)

好处:

  • 增加代码的可读性

  • #include <stdio.h>
    
    // 定义符号常量
    #define PI 3.14
    #define R 20
    
    int main(int argc,char *argv[])
    {
    	// 计算圆的周长 2 × PI × R
    	printf("计算圆的周长:%f\n",2 * PI * R);// %f:以小数显示
    	// 计算圆的面积 PI × R × R
    	printf("计算圆的面积:%f\n",PI * R * R);
    	return 0;
    }

    增强了代码的可维护性

  • 定义符号常量:

  • 需要借助预处理指令: #define

  • 格式:

#define 宏名称 宏值
  • 注意:

    • 宏名称和宏值之间用空格隔开

    • 句末不能添加任何符号

    • 无参的宏名称的命名采用大写,如果有多个单词,使用下划线分隔,举例:

#define MAX_VAL 9999
#define MIN_VAL 1000
  • 举例:

#include <stdio.h>

// 定义符号常量
#define PI 3.14
#define R 20

int main(int argc,char *argv[])
{
	// 计算圆的周长 2 × PI × R
	printf("计算圆的周长:%f\n",2 * PI * R);// %f:以小数显示
	// 计算圆的面积 PI × R × R
	printf("计算圆的面积:%f\n",PI * R * R);
	return 0;
}

日常错误

  • 问题描述:编译过程中,控制台出现类似于 \357这样的错误

  • 解答:一般都是代码中使用了中文标点符号导致的

  • 演示:

发布文章为共享知识以及个人学习笔记使用,持续不定时更新 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值