C语言基本语法细则
数据类型
-
基本数据类型:整型、浮点型、字符型
-
整型:int、short、long、unsigned int、unsigned short、unsigned long
int num = 10; short s_num = 20; long l_num = 30; unsigned int u_num = 40; unsigned short u_s_num = 50; unsigned long u_l_num = 60;
-
浮点型:float、double
float f_num = 3.14; double d_num = 3.1415;
-
字符型:char
char ch = 'A';
-
-
派生数据类型:数组、结构体、共用体、枚举
-
数组:
int arr[5] = {1, 2, 3, 4, 5};
-
结构体:
struct student { int id; char name[20]; float score; }; struct student stu1;
-
共用体:
union data { int num; float f_num; }; union data d;
-
枚举:
enum color {RED, GREEN, BLUE}; enum color c = RED;
-
变量声明与定义
-
变量的声明:指定变量的名称和类型,不分配内存空间
extern int num;
-
变量的定义:声明变量并分配内存空间
int num = 10;
标识符命名规则
- 只能由字母、数字和下划线组成
- 必须以字母或下划线开头
- 区分大小写
- 不能使用C语言的关键字作为标识符
运算符
-
算术运算符:+、-、*、/、%
int a = 10; int b = 3; int sum = a + b; // 13 int diff = a - b; // 7 int product = a * b; // 30 int quotient = a / b; // 3 int remainder = a % b; // 1
-
关系运算符:==、!=、>、<、>=、<=
int a = 10; int b = 3; if (a == b) { printf("a等于b"); } else if (a != b) { printf("a不等于b"); } else if (a > b) { printf("a大于b"); } else if (a < b) { printf("a小于b"); } else if (a >= b) { printf("a大于等于b"); } else if (a <= b) { printf("a小于等于b"); }
-
逻辑运算符:&&、||、!
int a = 10; int b = 3; if (a > 0 && b > 0) { printf("a和b都大于0"); } if (a > 0 || b > 0) { printf("a或者b大于0"); } if (!(a > 0)) { printf("a小于等于0"); }
-
赋值运算符:=、+=、-=、*=、/=、%=
int a = 10; int b = 3; a += b; // a = a + b; a -= b; // a = a - b; a *= b; // a = a * b; a /= b; // a = a / b; a %= b; // a = a % b;
-
自增自减运算符:++、–
int a = 10; a++; // a = a + 1; a--; // a = a - 1;
-
位运算符:&、|、^、~、<<、>>
int a = 5; // 二进制:0101 int b = 3; // 二进制:0011 int result = a & b; // 二进制:0001,十进制:1 result = a | b; // 二进制:0111,十进制:7 result = a ^ b; // 二进制:0110,十进制:6 result = ~a; // 二进制:1010,十进制:-6 result = a << 2; // 二进制:10100,十进制:20 result = a >> 1; // 二进制:0010,十进制:2
-
条件运算符:?:
int a = 10; int b = 3; int max = (a > b) ? a : b; // max为10
-
其他运算符:sizeof、&、*
int num = 10; int size = sizeof(num); // size为4,int类型占用4个字节 int *ptr = # // ptr为指向num的指针 int value = *ptr; // value为10,取ptr指向的值
控制语句
-
顺序结构:按照语句的顺序依次执行
int a = 10; int b = 3; int sum = a + b; printf("和为:%d", sum);
-
分支结构:if-else语句、switch语句
int score = 80; if (score >= 90) { printf("优秀"); } else if (score >= 80) { printf("良好"); } else if (score >= 70) { printf("中等"); } else if (score >= 60) { printf("及格"); } else { printf("不及格"); } switch (score / 10) { case 10: case 9: printf("优秀"); break; case 8: printf("良好"); break; case 7: printf("中等"); break; case 6: printf("及格"); break; default: printf("不及格"); break; }
-
循环结构:while循环、do-while循环、for循环、break语句、continue语句
int i = 0; while (i < 10) { printf("%d ", i); i++; } int j = 0; do { printf("%d ", j); j++; } while (j < 10); for (int k = 0; k < 10; k++) { printf("%d ", k); } for (int m = 0; m < 10; m++) { if (m == 5) { break; // 跳出循环 } printf("%d ", m); } for (int n = 0; n < 10; n++) { if (n == 5) { continue; // 跳过本次循环 } printf("%d ", n); }
函数
-
函数的声明与定义
// 声明 int add(int a, int b); // 定义 int add(int a, int b) { return a + b; }
-
函数的参数传递:按值传递、按指针传递
// 按值传递 int add(int a, int b) { return a + b; } // 按指针传递 void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } int main() { int a = 10; int b = 20; int sum = add(a, b); printf("和为:%d\n", sum); printf("交换前:a = %d, b = %d\n", a, b); swap(&a, &b); printf("交换后:a = %d, b = %d\n", a, b); return 0; }
数组
数组是一种存储相同类型数据的集合。下面是数组的一些用法示例:
数组的声明与定义
数组的声明和定义可以分开进行,也可以同时进行。以下是一些数组的声明和定义示例:
int numbers[5]; // 声明一个包含5个整数的数组
int numbers[] = {1, 2, 3, 4, 5}; // 声明并定义一个包含5个整数的数组
int numbers[5] = {1, 2, 3, 4, 5}; // 声明并定义一个包含5个整数的数组
在这些示例中,声明了一个包含5个整数的数组numbers,并分别使用了不同的方式进行了定义。
数组的元素访问
数组的元素可以通过索引进行访问,索引从0开始。以下是一些数组元素的访问示例:
int numbers[5] = {1, 2, 3, 4, 5};
printf("%d\n", numbers[0]); // 输出第一个元素
printf("%d\n", numbers[2]); // 输出第三个元素
numbers[3] = 10; // 修改第四个元素的值
printf("%d\n", numbers[3]); // 输出修改后的值
在这个示例中,定义了一个包含5个整数的数组numbers,并通过索引访问了数组的元素。
多维数组
多维数组是数组的数组,可以用于存储表格和矩阵等数据结构。以下是一些多维数组的用法示例:
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
printf("%d\n", matrix[0][0]); // 输出第一个元素
printf("%d\n", matrix[1][2]); // 输出第二行第三列的元素
matrix[2][1] = 10; // 修改第三行第二列的元素的值
printf("%d\n", matrix[2][1]); // 输出修改后的值
在这个示例中,定义了一个3x3的二维数组matrix,并通过索引访问了数组的元素。
指针
指针是存储内存地址的变量,可以用于间接访问和修改内存中的数据。以下是一些指针的用法示例:
指针的声明与定义
指针的声明和定义可以分开进行,也可以同时进行。以下是一些指针的声明和定义示例:
int *p; // 声明一个指向整数的指针
int *p = NULL; // 声明并定义一个指向整数的指针,并初始化为空指针
int number = 10;
int *p = &number; // 声明一个指向整数的指针,并将其指向number的地址
在这些示例中,声明了一个指向整数的指针p,并分别使用了不同的方式进行了定义。
指针的运算
指针可以进行取址运算和取值运算。以下是一些指针的运算示例:
int number = 10;
int *p = &number;
printf("%p\n", p); // 输出指针的值(即变量number的地址)
printf("%d\n", *p); // 输出指针所指向的变量的值
*p = 20; // 修改指针所指向的变量的值
printf("%d\n", number); // 输出修改后的值
在这个示例中,定义了一个指向整数的指针p,并通过取址运算符&获取变量number的地址,并通过取值运算符*访问指针所指向的变量。
指针作为函数参数
指针可以作为函数的参数,用于传递地址和修改变量的值。以下是一个指针作为函数参数的示例:
void changeValue(int *p) {
*p = 20;
}
int main() {
int number = 10;
changeValue(&number);
printf("%d\n", number);
return 0;
}
在这个示例中,定义了一个changeValue函数,接受一个指向整数的指针作为参数,并通过指针修改变量的值。在主函数中调用changeValue函数,并传递变量number的地址。
动态内存分配与释放
动态内存分配可以在程序运行时分配内存空间,动态内存释放可以在程序运行时释放内存空间。以下是一些动态内存分配和释放的示例:
int *p = (int *)malloc(sizeof(int)); // 分配一个整数大小的内存空间
*p = 10; // 在分配的内存空间中存储一个整数
free(p); // 释放分配的内存空间
在这个示例中,使用malloc函数分配一个整数大小的内存空间,并使用free函数释放分配的内存空间。
结构体
结构体是一种自定义的数据类型,可以用于存储多个不同类型的数据。以下是一些结构体的用法示例:
结构体的声明与定义
结构体的声明和定义可以分开进行,也可以同时进行。以下是一些结构体的声明和定义示例:
struct student {
char name[20];
int age;
};
struct student s1; // 声明一个结构体变量
struct student {
char name[20];
int age;
} s1; // 声明并定义一个结构体变量
typedef struct {
char name[20];
int age;
} Student;
Student s1; // 声明一个结构体变量
在这些示例中,声明了一个名为student的结构体,并分别使用了不同的方式进行了定义。
结构体的成员访问
结构体的成员可以通过点运算符进行访问。以下是一些结构体成员的访问示例:
struct student {
char name[20];
int age;
};
struct student s1;
strcpy(s1.name, "Tom");
s1.age = 20;
printf("%s\n", s1.name);
printf("%d\n", s1.age);
在这个示例中,定义了一个名为student的结构体变量s1,并通过点运算符访问了结构体的成员。
结构体作为函数参数
结构体可以作为函数的参数,用于传递结构体变量。以下是一个结构体作为函数参数的示例:
struct student {
char name[20];
int age;
};
void printStudent(struct student s) {
printf("Name: %s\n", s.name);
printf("Age: %d\n", s.age);
}
int main() {
struct student s1;
strcpy(s1.name, "Tom");
s1.age = 20;
printStudent(s1);
return 0;
}
在这个示例中,定义了一个名为student的结构体,并在主函数中创建了一个结构体变量s1。然后,定义了一个名为printStudent的函数,接受一个结构体变量作为参数,并打印结构体的成员。
结构体指针
结构体指针可以指向结构体变量,并通过指针访问结构体的成员。以下是一些结构体指针的示例:
struct student {
char name[20];
int age;
};
struct student s1;
struct student *p = &s1;
strcpy(p->name, "Tom");
p->age = 20;
printf("%s\n", p->name);
printf("%d\n", p->age);
在这个示例中,定义了一个名为student的结构体变量s1,并创建了一个指向s1的结构体指针p。然后,通过指针访问结构体的成员。
枚举
枚举是一种用户定义的数据类型,用于定义一组命名常量。以下是一些枚举的示例:
枚举的声明与定义
枚举的声明和定义可以分开进行,也可以同时进行。以下是一些枚举的声明和定义示例:
enum Color {
RED,
GREEN,
BLUE
};
enum Color c1; // 声明一个枚举变量
enum Color {
RED,
GREEN,
BLUE
} c1; // 声明并定义一个枚举变量
typedef enum {
RED,
GREEN,
BLUE
} Color;
Color c1; // 声明一个枚举变量
在这些示例中,声明了一个名为Color的枚举,并分别使用了不同的方式进行了定义。
枚举的赋值
枚举的成员可以通过赋值进行初始化。以下是一些枚举的赋值示例:
enum Color {
RED = 1,
GREEN = 2,
BLUE = 3
};
enum Color c1 = RED;
在这个示例中,定义了一个名为Color的枚举,并通过赋值将枚举的成员赋给枚举变量。
枚举的使用
枚举的成员可以直接使用。以下是一些枚举的使用示例:
enum Color {
RED,
GREEN,
BLUE
};
enum Color c1 = RED;
if (c1 == RED) {
printf("The color is red.\n");
} else if (c1 == GREEN) {
printf("The color is green.\n");
} else if (c1 == BLUE) {
printf("The color is blue.\n");
}
在这个示例中,定义了一个名为Color的枚举,并将枚举的成员赋给枚举变量c1。然后,通过if语句判断枚举的值,并打印相应的信息。
typedef
typedef可以用于定义一个新的类型别名。以下是一些typedef的示例:
typedef int Number;
Number n1 = 10;
在这个示例中,使用typedef定义了一个新的类型别名Number,并将int类型的n1赋给Number类型的变量。
共用体
共用体(union)是一种特殊的数据类型,它允许在同一内存空间中存储不同类型的数据。共用体的声明和定义可以分开进行,也可以同时进行。
声明与定义
以下是一些共用体的声明和定义示例:
union Data {
int i;
float f;
char str[20];
};
union Data d1; // 声明一个共用体变量
union Data {
int i;
float f;
char str[20];
} d1; // 声明并定义一个共用体变量
typedef union {
int i;
float f;
char str[20];
} Data;
Data d1; // 声明一个共用体变量
在这些示例中,声明了一个名为Data的共用体,并分别使用了不同的方式进行了定义。
共用体成员访问
共用体的成员访问可以使用点操作符(.)或箭头操作符(->)。以下是一些共用体的成员访问示例:
union Data {
int i;
float f;
char str[20];
};
union Data d1;
d1.i = 10;
printf("%d\n", d1.i);
d1.f = 3.14;
printf("%f\n", d1.f);
strcpy(d1.str, "Hello");
printf("%s\n", d1.str);
在这个示例中,定义了一个名为Data的共用体变量d1,并通过成员访问操作符给共用体的成员赋值。然后,通过成员访问操作符读取共用体的成员的值并打印出来。
需要注意的是,共用体的不同成员共享同一块内存空间,因此对一个成员的修改会影响其他成员的值。在使用共用体时,需要确保对共用体成员的访问是合法的,否则可能会导致数据错误。
文件操作
文件操作是在C语言中进行输入和输出的重要方式之一。可以使用标准库中提供的函数来进行文件的打开、关闭、读写等操作。
文件的打开与关闭
文件的打开可以使用fopen
函数,文件的关闭可以使用fclose
函数。以下是一些文件的打开与关闭的示例:
#include <stdio.h>
int main() {
FILE *file;
// 打开文件
file = fopen("file.txt", "r");
// 检查文件是否成功打开
if (file == NULL) {
printf("Failed to open the file.\n");
return 1;
}
// 文件操作...
// 关闭文件
fclose(file);
return 0;
}
在这个示例中,使用fopen
函数打开名为file.txt的文件,并将返回的文件指针赋给file变量。然后,使用fclose
函数关闭文件。
文件的读写操作
文件的读写操作可以使用fread
、fwrite
、fprintf
、fscanf
等函数。以下是一些文件的读写操作的示例:
#include <stdio.h>
int main() {
FILE *file;
int num;
char str[20];
// 打开文件
file = fopen("file.txt", "w");
// 写入数据
fprintf(file, "%d %s\n", 10, "Hello");
// 关闭文件
fclose(file);
// 打开文件
file = fopen("file.txt", "r");
// 读取数据
fscanf(file, "%d %s", &num, str);
// 关闭文件
fclose(file);
// 输出数据
printf("%d %s\n", num, str);
return 0;
}
在这个示例中,使用fprintf
函数将数据写入名为file.txt的文件。然后,使用fscanf
函数从文件中读取数据,并将读取的数据存储到相应的变量中。最后,使用printf
函数输出读取的数据。
预处理指令
预处理指令是在编译之前由预处理器处理的指令,用于对源代码进行一些处理。常见的预处理指令包括#include
、#define
、#ifdef
、#ifndef
、#endif
等。
#include
用于包含头文件,将头文件的内容插入到当前位置。#define
用于定义宏,将一个标识符替换为相应的值或代码片段。#ifdef
、#ifndef
、#endif
用于条件编译,根据条件判断是否编译相应的代码。
以下是一些预处理指令的示例:
#include <stdio.h>
#define PI 3.1415926
int main() {
double radius = 5.0;
double area;
area = PI * radius * radius;
printf("The area of the circle is %f\n", area);
return 0;
}
在这个示例中,使用#include
包含了stdio.h头文件,以便使用printf函数。使用#define
定义了宏PI,将其替换为3.1415926。然后,使用宏计算圆的面积,并使用printf函数输出结果。
预处理指令在编译之前被预处理器处理,可以在编译过程中对源代码进行一些特定的处理,如替换宏、条件编译等。预处理指令的使用可以提高代码的可读性和灵活性。
总结
C语言中的数据类型包括基本数据类型(整型、浮点型、字符型等)、指针、结构体、枚举等。可以使用这些数据类型来定义变量、进行运算和传递参数。掌握这些数据类型的使用方法,对于编写C语言程序是非常重要的。