💓博主CSDN主页:麻辣韭菜💓
⏩专栏分类:C语言从入门到精通⏪
🚚代码仓库:C语言初级🚚
🌹关注我🫵带你学习更多C知识
🔝🔝
目录
可变性: 变量的值可以在程序执行过程中发生改变,可以被赋予新的值。
命名规则: 变量的命名需要遵循命名规则,并且应具有描述性,以便程序员理解其用途。
不可变性: 常量的值在程序执行过程中不可改变,一经定义即不可再次赋值。
符号表示: 常量可以用符号表示,以提高程序的可读性和健壮性。
前言
从本篇开始,带你从不会C语言到精通C语言。这篇是让大家对C语言有个初步的了解。
下面的内容会拆分不同篇幅单独进行详细讲叙。
- 数据类型
- 变量、常量
- 字符串+转义字符+注释
- 选择语句
- 循环语句
- 函数
- 数组
- 操作符
- 常见关键字
- define 定义常量和宏
- 指针
- 结构体
1. 什么是C语言?
- C语言是一门面向过程的计算机编程语言,与C++、C#、Java等面向对象编程语言有所不同。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速、工作量小、可读性好、易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编语言代码生成的目标程序效率低10%-20%。因此,C语言可以编写系统软件。
- 当前阶段,在编程领域中,C语言的运用非常之多,它兼顾了高级语言和汇编语言的优点,相较于其它编程语言具有较大优势。计算机系统设计以及应用程序编写是C语言应用的两大领域。同时,C语言的普适较强,在许多计算机操作系统中都能够得到适用,且效率显著。
- C语言拥有经过了漫长发展历史的完整的理论体系,在编程语言中具有举足轻重的地位。
2. 第一个C语言程序
#include <stdio.h> //包含头文件 现在的你记住就好了。
//main函数是程序的入口
//一个工程中main函数有且仅有一个
int main()
{
printf("hello world\n"); //打印函数
return 0;
}
3. 数据类型
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
那为什么会有这么多的数据类型?
硬件依赖性: C 语言是一种系统级编程语言,允许对内存以及硬件进行底层操作。硬件对不同数据类型的支持不同,因此需要提供不同的数据类型满足底层需求。
灵活性与效率的权衡: C 语言被设计为一种高效且灵活的语言,允许程序员对数据进行底层操作,由于不同的数据类型在内存中的表示方式和使用方法不同,提供多种数据类型可以更好地满足不同的编程需求。
表示能力的需要: 有些数据类型可以表示更多的数据,例如 long int 可以表示更大范围的整数,而有些数据类型则可以提供更高的精度,如 double、long double。
适配不同的数据需求: C 语言广泛应用于嵌入式开发、系统编程、科学计算等不同领域,为了适应不同行业不同类型的数据需求,需要提供多样的数据类型。
那每种类型的大小是多少?
- char: 通常为 1 字节。
- int: 通常为 4 字节,但在一些嵌入式系统中可能为 2 字节。
- long: 通常为 4 字节,但在一些 64 位系统中可能为 8 字节。
- long long: 通常为 8 字节。
- float: 通常为 4 字节。
- double: 通常为 8 字节。
- 指针类型: 通常为 4 字节(32 位系统)或 8 字节(64 位系统)。
可以使用 sizeof
操作符来获取特定数据类型在当前平台上的大小。
#include <stdio.h>
int main() {
printf("Size of int: %zu bytes\n", sizeof(int));
printf("Size of double: %zu bytes\n", sizeof(double));
return 0;
}
%zu
是 C 语言中用来格式化输出的占位符之一,用于表示size_t
类型的值。在printf函数中,%zu
用于输出size_t类型的值。
size_t
是C语言中用于表示大小的一个无符号整数类型,通常用于数组索引和内存分配的大小等场景。在不同平台上,size_t
的大小可能会有所不同,但它通常被设计为足以容纳该平台上最大可能的对象大小。
3. 变量、常量
在编程中,变量和常量是两个基本概念,用于存储和表示数据,但它们的特性和使用方法有所不同。
变量(Variables)
变量是指在程序运行过程中其数值可以发生变化的存储位置,它具有以下特点:
-
可变性: 变量的值可以在程序执行过程中发生改变,可以被赋予新的值。
-
内存存储: 变量在内存中分配一定的空间用于存储数据。
-
声明与定义: 在使用之前,变量需要在程序中进行声明和定义。
-
命名规则: 变量的命名需要遵循命名规则,并且应具有描述性,以便程序员理解其用途。
- 字母、数字、下划线和美元符号: 变量名可以由字母(大小写均可)、数字、下划线(_) 和美元符号($) 组成,但不能以数字开头。
- 不能使用关键字: 变量名不能使用编程语言中的关键字或保留字。
- 大小写敏感: 变量名是大小写敏感的,即区分大小写。
- 具有描述性: 变量名应当具有描述性,能够清晰地表达其用途,让他人容易理解代码。
- 驼峰命名: 在 C++ 中,一般使用驼峰命名法(camelCase)或者下划线命名法(snake_case)来命名变量。驼峰命名法将变量名中的每个单词首字母大写,除了第一个单词;下划线命名法将单词用下划线连接。
例如,在 C++ 中,合法的变量名包括
myVariable
,my_variable
,myVariable123
,myVar
等。以下是一些遵循良好命名规则的变量名示例及其说明:
firstName
:驼峰命名法,描述了一个人的名字。total_price
:下划线命名法,描述了总价格。userAge
:驼峰命名法,描述了用户的年龄。MAX_SIZE
:全大写,使用下划线连接,描述了一个常量的最大尺寸。
int age; // 变量声明
age = 25; // 赋值
CopyInsert
常量(Constants)
常量是指其数值在程序执行过程中不发生改变的存储位置,它具有以下特点:
-
不可变性: 常量的值在程序执行过程中不可改变,一经定义即不可再次赋值。
-
直接值: 常量通常直接包含其数值,被视为字面值。
-
符号表示: 常量可以用符号表示,以提高程序的可读性和健壮性。
量类型:
-
整型常量(Integer Constants)
- 十进制整数:如10、20、-30等
- 八进制整数:以0开头,如012、075等
- 十六进制整数:以0x或0X开头,如0x1A、0Xff等
-
浮点型常量(Floating-point Constants)
- 普通浮点数:如3.14、-0.001等
- 科学记数法表示的浮点数:如6.02e23(表示6.02乘以10的23次方)
-
字符常量(Character Constants)
- 单个字符:使用单引号括起来的单个字符,如'A'、'b'、'9'等
- 转义字符:以反斜杠(\)开头的特殊字符表示,如'\n'(换行符)、'\t'(制表符)、'\0'(空字符)等
-
字符串常量(String Constants)
- 一串字符组成的序列(字符串):使用双引号括起来的字符序列,如"Hello, World"等。
-
枚举常量(Enumeration Constants)
enum Day {SUN, MON, TUE, WED, THU, FRI, SAT}; // 枚举常量
- 枚举类型定义的常量值:由关键字
enum
定义的枚举类型中的成员,例如:
- 枚举类型定义的常量值:由关键字
-
符号常量(Symbolic Constants)
使用
#define
定义的符号常量:#define PI 3.14159
使用
const
关键字定义的符号常量:const int MAX_SIZE = 100;
- 使用
#define
预处理指令或const
关键字定义的常量标识符:
- 使用
const float PI = 3.14159; // 定义一个常量 PI
变量的分类
变量可以根据其在程序中的作用域、生存期和存储位置等特性进行分类。以下是常见的变量分类:
根据作用域(Scope)分类
-
局部变量(Local Variables): 在函数内部声明的变量,只能在其被声明的函数内部访问,具有局部作用域。
void myFunction() { int localVar; // 局部变量 // 只能在 myFunction 函数内部访问 localVar }
-
全局变量(Global Variables): 在所有函数外部声明的变量,可以在整个程序内部访问。
int globalVar; // 全局变量 void myFunction() { // 在 myFunction 函数内部也可以访问 globalVar }
根据生存期(Lifetime)分类
-
自动变量(Automatic Variables): 在函数内部声明并且没有使用
static
修饰的变量,其生存期与包含它的代码块的执行周期相同。void myFunction() { int autoVar; // 自动变量 // 当 myFunction 执行结束时,autoVar 的生存期结束 }
-
静态变量(Static Variables): 使用
static
修饰的局部变量,其生存期是整个程序的执行周期。void myFunction() { static int staticVar; // 静态变量 // 当程序退出时 staticVar 的生存期结束 }
根据存储位置(Storage Class)分类
-
寄存器变量(Register Variables): 使用
register
修饰的变量,请求编译器将其存储在寄存器中以加快访问速度,但对其使用register
修饰只是一个建议,实际是否存储在寄存器中由编译器决定。register int counter; // 声明寄存器变量
-
外部变量(Extern Variables): 使用
extern
修饰的全局变量,表示该变量是在其他文件中定义的。extern int externVar; // 声明外部变量
4. 字符串+转义字符+注释
在C语言中,字符串是由一系列字符组成的序列,转义字符用于表示一些特殊字符,而注释则用于在代码中进行注解。下面简要介绍这三个概念:
字符串(String)
在C语言中,字符串是由双引号括起来的字符序列,例如:
char greeting[] = "Hello, World!";
在上述例子中,"Hello, World!"
就是一个字符串常量,它由字符'H'、'e'、'l'、'l'、'o'、','、' '、'W'、'o'、'r'、'l'、'd'和字符'\0'(表示字符串结束的空字符)组成。
转义字符(Escape Character)
转义字符用于表示在字符串中不易直接输入的字符,如换行符、制表符等。在C语言中,转义字符以反斜杠(\
)开头,例如:
char newLineTab[] = "First line\nSecond line\tTabbed";
在上述例子中,\n
表示换行,\t
表示制表符。
注释(Comments)
在C语言中,注释用于对代码进行注解,提高代码的可读性。C语言支持单行注释和多行注释:
// 这是单行注释,用于在行尾添加注解
/*
这是
多行注释,
用于注释多行内容
*/
5.选择语句
在 C 语言中,选择语句用于基于条件执行不同的代码块。常见的选择语句包括 if 语句和 switch 语句。
if 语句
if 语句用于条件判断,根据条件的真假执行不同的代码块。
if (condition) {
// 如果条件为真,执行这里的代码块
} else {
// 如果条件为假,执行这里的代码块
}
在 if 语句中,condition
是一个表达式,如果其值为真(非 0),则执行 if
代码块;否则,如果提供了 else
代码块,则执行 else
代码块。
switch 语句
switch 语句用于根据表达式的值选择执行不同情况的代码块。
switch (expression) {
case constant1:
// 如果 expression 等于 constant1,执行这里的代码块
break;
case constant2:
// 如果 expression 等于 constant2,执行这里的代码块
break;
default:
// 如果 expression 与所有常量都不匹配,执行这里的代码块
}
在 switch 语句中,expression
是一个表达式,其值会与 case
后的常量进行比较,找到匹配的常量后执行相应的代码块。如果没有找到匹配的常量,会执行 default
代码块(如果存在)。
这些选择语句允许根据条件或表达式的值,执行不同的代码分支,从而增加程序的灵活性和多样性。
6.循环语句
在 C 语言中,循环语句用于多次执行相同或类似的代码块,常见的循环语句包括 for 循环、while 循环和 do...while 循环。
for 循环
for 循环用于根据指定条件重复执行代码块,通常对循环次数有明确的控制。
for (初始化表达式; 循环条件; 更新表达式) {
// 重复执行的代码块
}
其中,初始化表达式一般用于初始化循环变量;循环条件表示每轮循环是否继续;更新表达式用于更新循环变量的值。for 循环会先执行初始化表达式,然后检查循环条件,如果为真则执行循环体,执行更新表达式,再次检查循环条件,如此往复。
while 循环
while 循环用于在循环条件为真时重复执行代码块。
while (循环条件) {
// 重复执行的代码块
}
在每次循环开始时,先检查循环条件,如果为真则执行循环体,然后再次检查循环条件,如此往复直至循环条件为假时结束循环。
do...while 循环
do...while 循环先执行一次循环体,然后在循环条件为真时重复执行代码块。
do {
// 重复执行的代码块
} while (循环条件);
do...while 循环会先执行循环体,然后检查循环条件,如果为真则继续执行循环体,如此往复。
循环语句允许根据指定的条件重复执行代码块,可根据不同的场景选择合适的循环结构以实现所需的逻辑。
7.函数
在 C 语言中,函数用于封装可重用的代码块,同时也对程序进行模块化,提高代码的可读性和可维护性。以下是 C 语言中函数的一般形式:
return_type function_name(parameter1_type parameter1, parameter2_type parameter2, ...) {
// 函数体,包含要执行的代码
// 可选:返回一个值
}
其中:
return_type
表示函数的返回类型,即函数执行完毕后将返回的数据类型。function_name
是函数的名称,用于在其他部分调用该函数。(parameter1_type parameter1, parameter2_type parameter2, ...)
是函数的参数列表,用于传递数据给函数。{}
内是函数体,包含了具体的代码实现。return
语句可用于结束函数的执行,并返回一个值。
以下是一个简单的函数示例:
int add(int a, int b) {
return a + b;
}
CopyInsert
在上述示例中,add
是函数名,它接受两个参数 a
和 b
,返回它们的和。你可以在其他地方通过 add
函数来得到两个数的和。
使用函数可以提高代码的复用性,降低维护成本,并能将复杂的问题分解成小的模块,有利于程序的开发和维护。
8.数组
在 C 语言中,数组是一种用于存储同一类型数据的集合。以下是 C 语言中数组的一般形式:
type arrayName[arraySize] = {element0, element1, ..., elementSize-1};
其中:
type
是数组中元素的数据类型。arrayName
是数组的名称。arraySize
是数组中元素的数量。- 可选部分
{element0, element1, ..., elementSize-1}
是数组中的初始元素值,可以省略不写。
以下是一个简单的整型数组示例:
int numbers[5] = {1, 2, 3, 4, 5};
CopyInsert
数组中的元素可以通过索引进行访问,索引从 0 开始,例如 numbers[0]
表示数组 numbers
的第一个元素。
9. 操作符
在C语言中,操作符用于对变量和值进行操作,进行数学计算和逻辑判断等。以下是C语言中常见的操作符类型:
-
算术操作符
+
:加法-
:减法*
:乘法/
:除法%
:取模(求余)
-
关系操作符
==
:等于!=
:不等于>
:大于<
:小于>=
:大于等于<=
:小于等于
-
逻辑操作符
&&
:逻辑与||
:逻辑或!
:逻辑非
-
赋值操作符
=
:赋值+=
:加后赋值-=
:减后赋值*=
:乘后赋值/=
:除后赋值%=
:取模后赋值
-
递增/递减操作符
++
:递增--
:递减
-
位操作符
&
:按位与|
:按位或^
:按位异或~
:按位取反<<
:左移>>
:右移
10.常见关键字
typedef
在C语言中,typedef
是用来创建新的数据类型名字的关键字。通过typedef
,可以为已有的数据类型起一个新名字,提高代码的可读性和可维护性。
以下是 typedef
关键字的一般用法:
typedef <旧数据类型> <新数据类型名>;
例如,我们可以使用 typedef
来定义一个新的数据类型名字,如:
typedef unsigned int uint;
在这里,typedef
创建了一个名为 uint
的新数据类型,代表了无符号整数类型 unsigned int
。
还可以用typedef
为结构体、联合体、枚举定义新的名字,例如:
typedef struct {
int x;
int y;
} Point;
CopyInsert
在这个例子中,Point
就是该匿名结构体的新名字。
static
在 C 语言中,static
是一个关键字,用于指定在不同上下文中的不同含义。
-
在函数内部,
static
修饰局部变量时,表示该变量具有静态存储周期。这意味着该变量在程序开始执行时被初始化,并且只会被初始化一次,而不像普通的局部变量在每次函数调用时都会被初始化。void exampleFunction() { static int counter = 0; // 静态局部变量 counter++; }
在上面的例子中,
counter
是一个静态局部变量,它在每次函数调用之间保持其值,而不像普通的局部变量在每次函数调用时被重置。 -
在全局变量声明中,
static
修饰全局变量时,表示限定该变量的作用域为声明它的文件。被修饰的全局变量对其他文件不可见(具有文件作用域)。static int globalVariable = 10; // 具有文件作用域的全局变量
在这个例子中,
globalVariable
变量只能在声明它的文件中访问,对其他文件不可见。 -
在函数声明中,
static
修饰函数时,表示将该函数限定为只能在声明它的文件中调用,不能被其他文件中的函数调用。static void helperFunction() { // 静态函数 // 函数实现 }
上述的
helperFunction
只能在声明它的文件中被调用。
static
关键字根据上下文的不同,具有不同的作用,通常用于限制变量或函数的作用域或存储周期。
11.#define 定义常量和宏
在 C 语言中,#define
是一个预处理指令,用于创建符号常量和宏,并在编译之前对其进行文本替换。#define
可以用来定义常量或者创建带参数的宏。
定义常量
可以使用 #define
创建符号常量,其值在程序中不会改变。常见的写法是:
#define PI 3.14159
#define MAX_ITERATIONS 1000
在这里,PI
和 MAX_ITERATIONS
都被定义为常量,它们在编译时会被替换为其对应的值。
创建带参数的宏
#define
也可以用来创建带参数的宏,这种宏会在代码中被展开为参数化的代码段。例如:
#define SQUARE(x) ((x) * (x))
在这个例子中,SQUARE
是一个带参数的宏,它会将 (x) * (x)
这个表达式的结果作为参数 x
的平方,使用时可以:
int result = SQUARE(3); // 会被替换为 int result = ((3) * (3));
在这两种情况下,由 #define
定义的常量和宏都是在编译时进行文本替换的,它们可以提高代码的可读性和可维护性,并且在程序中多次使用时只需要修改一次定义。
12.指针
在C语言中,指针是一种特殊的数据类型,它用于存储变量的内存地址。指针提供了直接访问和操作内存的能力,是C语言中非常重要的概念。
以下是指针的一般形式:
type *ptr;
其中:
type
是指针所指向的数据类型。*
表示声明一个指针。ptr
是指针的名称。
获取变量的地址
可以使用取地址操作符&
获取变量的地址,并将其赋值给指针:
int num = 10;
int *ptr = # // ptr 指向变量 num 的地址
间接访问指针所指向的内存
可以使用间接访问操作符*
访问指针所指向的内存中的值:
int value = *ptr; // 获取 ptr 所指向地址的值
13.结构体
在 C 语言中,结构体(Structures)是一种用户自定义的数据类型,用于组合多个不同类型的变量,从而构成一个更加复杂的数据结构。
定义结构体
结构体的定义使用 struct
关键字,指定结构体的成员变量及其数据类型:
struct Person {
char name[50];
int age;
float salary;
};
在这个例子中,struct Person
定义了一个包含名字、年龄和工资三个成员变量的结构体类型。
声明结构体变量
声明结构体变量的方法如下:
struct Person person1;
在这个例子中,person1
是一个类型为 struct Person
的结构体变量。
访问结构体成员
使用成员访问操作符 .
可以访问结构体变量的成员:
strcpy(person1.name, "Alice");
person1.age = 30;
person1.salary = 50000.00;
这篇只是初识C语言,让大家对C语言有个初步的了解!这里面所有的内容在后序的博客中都会详细讲解。