本篇文章是为了复习数据结构,速过一遍C语言的笔记;较于基础,供大家参考!!!
目录
🍓常量
🍉常量是一种在程序执行期间不会改变的固定值,常量分为五种类型如:
🍌整形常量
整形常量代表没有小数部分的整数。它们可以是正数、负数或零。例如:1, -99, 2048。
🍌实型常量
实型常量是带有小数点的数字,或者是科学计数法表示的数字;例如:3.1415
、-0.01、
1.23e10。
🍌字符常量
字符常量是在单引号内的单个字符;例如:'a'
、'1'
、'$'。
🍌符号常量
符号常量是使用标识符来代替某个特定的值的常量。在C或C++中,通常使用#define
预处理器来定义符号常量。例如:#define PI 3.14159
。
🍌字符串型常量
字符串常量是在双引号内的字符序列;例如:"Hello, world!"
、"123 abc"
🍓变量
🍉定义:变量的定义是指明一个变量的类型和名称,这样程序就能为这个变量分配内存空间,并在程序中通过这个名称引用该变量的值。变量的定义包括了类型声明和变量名,可以选择性地包括一个初始化值。
🍉基本格式
<数据类型> <变量名>;
🍉示例
int age = 30; // 定义一个整型变量age,并初始化为30
double price = 10.99; // 定义一个双精度浮点型变量price,并初始化为10.99
char letter = 'A'; // 定义一个字符型变量letter,并初始化为'A'
🍉带初始化的变量定义
int age = 30; // 定义一个整型变量age,并初始化为30
double price = 10.99; // 定义一个双精度浮点型变量price,并初始化为10.99
char letter = 'A'; // 定义一个字符型变量letter,并初始化为'A'
🍉变量名
🍌变量名用于标识存储在内存中的某个位置。变量名的选择需要遵守一定的规则和最佳实践,这有助于代码的可读性和可维护性。
🍌规则
- 字符集:变量名只能使用字母(A-Z,a-z)、数字(0-9)和下划线(_)。变量名的第一个字符不能是数字。
- 区分大小写:在C语言中,大小写是敏感的。例如,
age
、Age
和AGE
会被视为三个不同的变量。 - 关键字限制:不能使用C语言的关键字作为变量名,例如
int
、return
、void
等。
🍌好的变量名
- 有意义的命名:选择有描述性的变量名,这样可以更容易理解变量的用途。例如,使用
age
而不是a
来存储一个人的年龄。 - 简洁但清晰:变量名应该足够简短,同时又能清楚地描述信息。例如,
numStudents
比numberOfStudentsInClass
更简洁,同时信息也足够清晰。 - 使用下划线或驼峰式命名法:为了增加变量名的可读性,可以使用下划线分隔单词,如
max_height
,或使用驼峰式命名法,如maxHeight
。 - 避免使用单一字符:除非在简单的循环中使用(如
for (int i = 0; i < 10; i++)
),通常应避免使用单一字符作为变量名,因为这样的命名缺乏描述性。
虽然变量名没有硬性要求,但是在命名的时候尽可能的要保证规范和见文知意。
🍓C的数据类型
🍉基本数据类型
🍌整型
用于存储整数。根据存储的范围和符号,可以进一步分为 short int
, unsigned short int
, int
, unsigned int
, long int
, unsigned long int
, long long int
, 和 unsigned long long int
。
🍌字符型
用于存储单个字符。可以是 signed char
或 unsigned char
,通常占用1个字节。
🍌浮点型
- 单精度浮点型 (
float
):用于存储单精度浮点数。 - 双精度浮点型 (
double
):用于存储双精度浮点数。
🍉基本数据类型
🍌数组类型
数组是一种数据结构,用于存储固定大小的相同类型元素的集合。数组的所有元素都存储在连续的内存位置中
int numbers[5] = {1, 2, 3, 4, 5}; // 整型数组
char name[10] = "John"; // 字符数组
🍌结构体类型
结构体是用户定义的数据类型,允许存储不同类型的数据项。结构体适合用来封装数据。
struct Person {
char name[50];
int age;
float height;
};
struct Person person1 = {"Alice", 30, 5.5};
🍌共用体类型
共用体(或联合体)是一种结构,其成员共享同一块内存。定义共用体时,编译器只分配足够的内存来存储最大的成员。
union Data {
int i;
float f;
char str[20];
};
union Data data;
data.i = 10;
🍌枚举型
枚举是一组命名的整型常数。枚举是用于声明一组命名的常量,它通过使用枚举可以更清晰地表达意图。
enum Color { Red, Green, Blue };
enum Color favoriteColor = Green;
🍌指针类型
指针是一个变量,其值为另一个变量的地址,即变量的位置在内存中的位置。通过指针,可以直接访问和操作内存地址中存储的数据。
int val = 20;
int *ptr = &val; // 指针ptr指向变量val的地址
🍉数据类型转换
🍌隐式类型转换(自动类型转换)
这种转换是由编译器自动进行的,不需要程序员进行任何干预。通常发生在将一种数值类型的数据赋给另一种数值类型的变量时,特别是从小范围类型(如 int
)到大范围类型(如 double
)的转换。
示例:
int i = 100;
double d;
d = i; // 隐式转换,int自动转换为double
在这种情况下,int
类型的 i
被自动转换为 double
类型的 d
。
🍌显式类型转换(强制类型转换)
当你需要将一种类型的变量强制转换为另一种类型时,可以使用显式类型转换。这通过类型转换运算符完成,其语法为 (type_name) expression
。
示例:
double d = 9.78;
int i;
i = (int) d; // 显式转换,double强制转换为int
在这个例子中,double
类型的 d
被强制转换为 int
类型的 i
,只保留整数部分,小数部分被丢弃。
🍌注意事项和潜在问题
- 精度丢失:在将浮点类型转换为整数类型时,小数部分将被丢弃,这可能导致数据的精度损失。
- 溢出:当将较大的数据类型转换为较小的数据类型时(如从
long long
到short
),如果数据超出目标类型的范围,则会发生溢出。 - 符号问题:从有符号类型向无符号类型转换时,如果数值为负,则转换结果可能不符合预期,因为无符号类型不支持负数。
在使用数据类型转换时,确保理解目标类型和源类型的大小及其范围限制,以避免潜在的错误和数据损失。
🍓输入输出
🍊在C语言中,输入和输出是通过标准输入输出库(stdio.h
)提供的函数进行的。最常见的输出函数是 printf
,而输入主要是通过 scanf
函数处理。这两个函数提供了灵活的方式来读取和打印各种类型的数据。
🍊输出
printf
函数
printf
是一个非常强大的函数,用于将格式化的文本输出到标准输出(通常是终端或控制台)。
int printf(const char *format, ...);
format
字符串包含文本以及格式说明符,格式说明符用于后续参数的格式化。...
表示函数接受可变数量的参数。
示例
#include <stdio.h>
int main() {
int number = 50;
float pi = 3.14159;
printf("Number: %d, Pi: %.2f\n", number, pi);
return 0;
}
这个程序会打印:
Number: 50, Pi: 3.14
🍊输入
scanf
函数
scanf
用于从标准输入(通常是键盘)读取格式化输入
int scanf(const char *format, ...);
format
字符串包含格式说明符,这些说明符定义了读取数据的类型。...
表示函数需要相应数量的指针参数,用于存储读取的数据。
示例
#include <stdio.h>
int main() {
int age;
float height;
printf("Enter your age and height: ");
scanf("%d %f", &age, &height);
printf("Age: %d, Height: %.2f\n", age, height);
return 0;
}
这个程序会请求用户输入年龄和身高,然后显示它们。
🍊常见的格式说明符
%d:整型
%f:浮点型
%c:字符
%s:字符串
%x、%X:十六进制整数
%%:输出一个百分号
🍓运算符
🍌算术运算符
用于执行基本的数学计算。
- +:加法
- -:减法
- *:乘法
- /:除法
- %:模运算(求余数,只用于整数)
🍌关系运算符
用于比较两个值的大小,结果为真(1)或假(0)。
==
:等于!=
:不等于>
:大于<
:小于>=
:大于等于<=
:小于等于
🍌逻辑运算符
用于组合多个条件表达式。
&&
:逻辑与||
:逻辑或!
:逻辑非
🍌 位运算符
用于直接对整型数据的二进制位进行操作。
&
:按位与|
:按位或^
:按位异或~
:按位取反<<
:左移>>
:右移
🍌 赋值运算符
用于给变量赋值。
=
:简单赋值+=
、-=
、*=
、/=
、%=
:复合赋值运算符,例如a += b
等价于a = a + b
🍌条件运算符
也称为三元运算符,用于基于条件表达式选择两个值中的一个。
? :
:表达式condition ? expr1 : expr2
,如果condition
为真,则结果为expr1
,否则为expr2
🍌 逗号运算符
用于在同一行内链接多个表达式,从左到右求值,并返回最右边表达式的值。
,
:例如a = (t=3, t+2)
,先执行t=3
,然后计算t+2
,最终a
的值为5
🍌sizeof 运算符
用于获取数据类型或变量在内存中占用的字节数。
sizeof
:sizeof(type)
或sizeof(expression)
🍌示例
#include <stdio.h>
int main() {
int a = 10, b = 5;
int result;
result = a + b; // 15
printf("a + b = %d\n", result);
result = a > b; // 1 (true)
printf("a > b = %d\n", result);
result = a && b; // 1 (true)
printf("a && b = %d\n", result);
result = a & b; // 0
printf("a & b = %d\n", result);
result = a * b;
printf("a * b = %d\n", result);
return 0;
}
🍓选择与循环
🍉选择结构
🍌if-else
语句
- 如果条件为真,执行一个代码块;如果为假,执行另一个代码块。
if (condition) {
// code to execute if condition is true
} else {
// code to execute if condition is false
}
🍌if-else if-else
语句
- 用于多条件判断,从多个条件中选择一个执行。
if (condition1) {
// code if condition1 is true
} else if (condition2) {
// code if condition2 is true
} else {
// code if none of the conditions are true
}
🍌switch
语句
- 基于变量的值,选择多个代码块之一来执行。每个代码块用
case
标签标识,通常用于代替多个if
语句。
switch (variable) {
case value1:
// code to execute
break;
case value2:
// code to execute
break;
default:
// code to execute if none of the cases match
}
🍉循环结构
🍌while
循环
- 在条件为真的情况下重复执行代码块。
while (condition) {
// code to execute repeatedly
}
🍌do-while
循环
- 至少执行一次代码块,之后如果条件为真,则继续执行。
do {
// code to execute repeatedly
} while (condition);
🍌for
循环
- 通常用于执行固定次数的循环,允许在一个表达式中初始化变量,检查条件,和更新变量。
for (initialization; condition; update) {
// code to execute repeatedly
}
希望这些能对刚学习算法的同学们提供些帮助哦!!!