Learn in 10 minutes

Learn in 10 minutes

10分钟学会C语言

编程语言

C语言是一种功能强大的通用编程语言,以其高效性和贴近硬件的特性而闻名。本教程涵盖了C语言编程的基础知识,帮助你快速理解这门语言。

1. 编写第一个C程序

让我们从经典的"Hello, World!“程序开始。创建一个名为hello.c的文件并输入以下代码:

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

保存文件并使用GCC等C编译器进行编译:

gcc hello.c -o hello
./hello

输出将是:

Hello, World!

这个简单程序展示了C语言的基本结构:

  • #include <stdio.h> 包含标准输入/输出库
  • int main() 是程序的入口点
  • printf() 显示文本输出
  • return 0 表示执行成功

2. 基本语法

C语言使用结构化语法,用分号终止语句,用花括号{}定义代码块。

// 这是单行注释
/* 这是多行注释 */

#include <stdio.h>

int main() {
    printf("Hello, World!\n");
    return 0;
}

C语言的基本语法规则:

  • 分号:每个语句必须以分号;结尾
  • 注释:单行注释使用//,多行注释使用/* */
  • 代码块:由花括号{}定义
  • 大小写敏感:C语言区分大小写(mainMain不同)

3. 变量和数据类型

C语言是静态类型语言,意味着在使用变量之前必须声明其类型。

基本变量命名规则

  • 变量名可以包含字母、数字和下划线
  • 变量名不能以数字开头
  • 变量名区分大小写
  • C语言关键字不能用作变量名

C语言的主要数据类型

  • int:整数(例如42-10
  • float:浮点数(例如3.14-2.5
  • double:双精度浮点数
  • char:单个字符(例如'A''z'
  • void:无类型
int age = 25;
float temperature = 36.5;
double pi = 3.14159265359;
char grade = 'A';

3.1 整数类型

C语言提供了几种不同大小的整数类型:

char small_number = 100;        // 通常1字节
short medium_number = 32000;    // 通常2字节
int regular_number = 1000000;   // 通常4字节
long large_number = 1000000000; // 通常4或8字节

3.2 浮点类型

float single_precision = 3.14f;
double double_precision = 3.14159265359;
long double extended_precision = 3.14159265358979323846L;

3.3 字符类型

字符使用ASCII编码作为整数存储:

char letter = 'A';
char digit = '7';
char newline = '\n';
char tab = '\t';

4. 常量

常量是在程序执行期间不能更改的固定值:

const int MAX_SIZE = 100;
const float PI = 3.14159;
const char NEWLINE = '\n';

#define MAX_USERS 1000
#define PI 3.14159

5. 输入和输出

C语言使用stdio.h中的函数进行输入和输出操作。

5.1 使用printf()输出

#include <stdio.h>

int main() {
    int age = 25;
    float height = 1.75;
    char name[] = "John";

    printf("Hello, %s!\n", name);
    printf("You are %d years old\n", age);
    printf("Your height is %.2f meters\n", height);

    return 0;
}

常用格式说明符:

  • %d - 整数
  • %f - 浮点数/双精度数
  • %c - 字符
  • %s - 字符串
  • %p - 指针

5.2 使用scanf()输入

#include <stdio.h>

int main() {
    int age;
    float height;
    char name[50];

    printf("Enter your name: ");
    scanf("%s", name);

    printf("Enter your age: ");
    scanf("%d", &age);

    printf("Enter your height: ");
    scanf("%f", &height);

    printf("Hello %s, you are %d years old and %.2f meters tall\n",
           name, age, height);

    return 0;
}

6. 运算符

C语言提供了丰富的运算符用于各种计算。

6.1 算术运算符

int a = 10, b = 3;

printf("Addition: %d\n", a + b);      // 13
printf("Subtraction: %d\n", a - b);   // 7
printf("Multiplication: %d\n", a * b); // 30
printf("Division: %d\n", a / b);      // 3
printf("Modulus: %d\n", a % b);       // 1

6.2 比较运算符

int x = 5, y = 10;

printf("Equal: %d\n", x == y);     // 0 (false)
printf("Not equal: %d\n", x != y); // 1 (true)
printf("Greater than: %d\n", x > y);  // 0
printf("Less than: %d\n", x < y);  // 1

6.3 逻辑运算符

int a = 1, b = 0;

printf("AND: %d\n", a && b);  // 0
printf("OR: %d\n", a || b);   // 1
printf("NOT: %d\n", !a);      // 0

6.4 位运算符

unsigned int a = 5;  // 二进制 0101
unsigned int b = 3;  // 二进制 0011

printf("AND: %d\n", a & b);   // 1 (0001)
printf("OR: %d\n", a | b);    // 7 (0111)
printf("XOR: %d\n", a ^ b);   // 6 (0110)
printf("NOT: %d\n", ~a);      // 取决于系统
printf("Left shift: %d\n", a << 1);  // 10 (1010)
printf("Right shift: %d\n", a >> 1); // 2 (0010)

7. 控制流

C语言提供了几种控制流语句来管理程序执行。

7.1 if语句

int age = 20;

if (age >= 18) {
    printf("Adult\n");
} else if (age >= 13) {
    printf("Teen\n");
} else {
    printf("Child\n");
}

7.2 switch语句

int day = 3;

switch (day) {
    case 1:
        printf("Monday\n");
        break;
    case 2:
        printf("Tuesday\n");
        break;
    case 3:
        printf("Wednesday\n");
        break;
    default:
        printf("Other day\n");
}

7.3 for循环

for (int i = 0; i < 5; i++) {
    printf("i = %d\n", i);
}

7.4 while循环

int count = 0;
while (count < 5) {
    printf("Count: %d\n", count);
    count++;
}

7.5 do-while循环

int count = 0;
do {
    printf("Count: %d\n", count);
    count++;
} while (count < 5);

7.6 break和continue

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        break;  // 退出循环
    }
    if (i % 2 == 0) {
        continue;  // 跳过偶数
    }
    printf("i = %d\n", i);  // 输出: 1, 3
}

8. 数组

数组存储多个相同类型的值。

8.1 一维数组

int numbers[5] = {1, 2, 3, 4, 5};

// 访问元素
printf("First element: %d\n", numbers[0]);
printf("Last element: %d\n", numbers[4]);

// 修改元素
numbers[0] = 10;

// 遍历数组
for (int i = 0; i < 5; i++) {
    printf("numbers[%d] = %d\n", i, numbers[i]);
}

8.2 多维数组

int matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

// 访问元素
printf("matrix[1][2] = %d\n", matrix[1][2]);  // 6

// 遍历二维数组
for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 3; j++) {
        printf("%d ", matrix[i][j]);
    }
    printf("\n");
}

9. 字符串

在C语言中,字符串是以空字符\0结尾的字符数组。

char greeting[] = "Hello";  // 自动包含空终止符
char name[20] = "John";

// string.h中的字符串函数
#include <string.h>

char str1[20] = "Hello";
char str2[20] = "World";

printf("Length: %lu\n", strlen(str1));  // 5
strcpy(str1, str2);  // 将str2复制到str1
printf("After copy: %s\n", str1);  // World

if (strcmp(str1, str2) == 0) {
    printf("Strings are equal\n");
}

10. 函数

函数是执行特定任务的可重用代码块。

10.1 函数定义和调用

#include <stdio.h>

// 函数声明
int add(int a, int b);

int main() {
    int result = add(5, 3);
    printf("5 + 3 = %d\n", result);
    return 0;
}

// 函数定义
int add(int a, int b) {
    return a + b;
}

10.2 无返回值的函数

void greet(char name[]) {
    printf("Hello, %s!\n", name);
}

int main() {
    greet("Alice");
    return 0;
}

10.3 递归函数

int factorial(int n) {
    if (n <= 1) {
        return 1;
    }
    return n * factorial(n - 1);
}

int main() {
    printf("5! = %d\n", factorial(5));  // 120
    return 0;
}

11. 指针

指针是存储内存地址的变量。

11.1 基本指针用法

int number = 42;
int *ptr = &number;  // ptr存储number的地址

printf("Value: %d\n", number);     // 42
printf("Address: %p\n", &number);  // 内存地址
printf("Pointer value: %d\n", *ptr); // 42 (解引用)

// 通过指针修改值
*ptr = 100;
printf("New value: %d\n", number);  // 100

11.2 指针和数组

int numbers[] = {1, 2, 3, 4, 5};
int *ptr = numbers;  // 指向第一个元素

printf("First element: %d\n", *ptr);        // 1
printf("Second element: %d\n", *(ptr + 1)); // 2

// 数组名本质上是指向第一个元素的指针
for (int i = 0; i < 5; i++) {
    printf("numbers[%d] = %d\n", i, *(numbers + i));
}

11.3 指针和函数

void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 5, y = 10;
    printf("Before swap: x=%d, y=%d\n", x, y);
    swap(&x, &y);
    printf("After swap: x=%d, y=%d\n", x, y);
    return 0;
}

12. 结构体

结构体允许你将相关的变量组合在一起。

12.1 定义和使用结构体

#include <stdio.h>
#include <string.h>

// 结构体定义
struct Student {
    char name[50];
    int age;
    float gpa;
};

int main() {
    // 创建结构体变量
    struct Student student1;

    // 赋值
    strcpy(student1.name, "Alice");
    student1.age = 20;
    student1.gpa = 3.8;

    // 访问结构体成员
    printf("Name: %s\n", student1.name);
    printf("Age: %d\n", student1.age);
    printf("GPA: %.2f\n", student1.gpa);

    return 0;
}

12.2 带指针的结构体

struct Point {
    int x;
    int y;
};

int main() {
    struct Point p1 = {10, 20};
    struct Point *ptr = &p1;

    printf("Coordinates: (%d, %d)\n", ptr->x, ptr->y);

    return 0;
}

13. 动态内存分配

C语言提供了动态内存管理的函数。

13.1 malloc、calloc、realloc、free

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 为5个整数分配内存
    int *numbers = (int*)malloc(5 * sizeof(int));

    if (numbers == NULL) {
        printf("Memory allocation failed!\n");
        return 1;
    }

    // 初始化数组
    for (int i = 0; i < 5; i++) {
        numbers[i] = i * 10;
    }

    // 打印数组
    for (int i = 0; i < 5; i++) {
        printf("numbers[%d] = %d\n", i, numbers[i]);
    }

    // 释放分配的内存
    free(numbers);

    return 0;
}

13.2 动态字符串分配

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char *name = (char*)malloc(50 * sizeof(char));

    if (name != NULL) {
        strcpy(name, "Dynamic string");
        printf("Name: %s\n", name);
        free(name);
    }

    return 0;
}

14. 文件操作

C语言提供了读取和写入文件的函数。

14.1 写入文件

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "w");

    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    fprintf(file, "Hello, File!\n");
    fprintf(file, "This is a test.\n");

    fclose(file);
    printf("File written successfully.\n");

    return 0;
}

14.2 读取文件

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");

    if (file == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    char buffer[100];

    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer);
    }

    fclose(file);

    return 0;
}

15. 预处理器指令

预处理器指令在编译之前处理。

15.1 #include

#include <stdio.h>    // 系统头文件
#include "myheader.h" // 用户头文件

15.2 #define

#define PI 3.14159
#define MAX(a, b) ((a) > (b) ? (a) : (b))

int main() {
    double area = PI * 5 * 5;
    int larger = MAX(10, 20);

    printf("Area: %.2f\n", area);
    printf("Larger number: %d\n", larger);

    return 0;
}

15.3 条件编译

#define DEBUG 1

int main() {
    #ifdef DEBUG
        printf("Debug mode enabled\n");
    #endif

    #if DEBUG == 1
        printf("Debug level 1\n");
    #elif DEBUG == 2
        printf("Debug level 2\n");
    #else
        printf("No debug\n");
    #endif

    return 0;
}

16. 错误处理

C语言没有内置的异常处理,所以我们使用返回值和错误代码。

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r");

    if (file == NULL) {
        printf("Error opening file: %s\n", strerror(errno));
        return 1;
    }

    fclose(file);
    return 0;
}

这个全面的C语言教程涵盖了开始用C语言编程所需的基本概念。练习这些示例,随着对语言的熟悉程度提高,探索更高级的主题,如链表、函数指针和多文件程序。