[C.C++] C语言超详细教程

18 0
Honkers 12 小时前 来自手机 | 显示全部楼层 |阅读模式

系列文章目录


1 运算符

1.1 算术运算符:

常用的算术运算符包括加+、减-、乘*、除/、余数%。
关系运算符:

比较两个值的关系,如等于==、不等于!=、大于>、小于<等。
逻辑运算符:

用于计算布尔表达式结果,如与&&、或||、非!。

2 控制语句

2.1 条件语句:

if:根据条件执行代码块。
else if 和 else:提供多个条件分支。
switch:基于单一变量的多个可能值进行分支。
示例:

  1. if (age >= 18) {
  2. printf("成年人\n");
  3. } else {
  4. printf("未成年人\n");
  5. }
复制代码

2.2 循环语句:

for:适合已知次数的循环(如:

  1. for (int i = 0; i < 5; i++) {
  2. printf("%d ", i);
  3. }
复制代码

while:适合未知次数的循环,基于条件(如:

  1. int i = 0;
  2. while (i < 5) {
  3. printf("%d ", i);
  4. i++;
  5. }
复制代码

do…while:至少执行一次的循环形式(如:

  1. int i = 0;
  2. do {
  3. printf("%d ", i);
  4. i++;
  5. } while (i < 5);
复制代码

跳转语句:

break:终止循环或switch结构。
continue:跳过当前循环的剩余部分,继续下一次循环。
return:结束函数并返回值。

3 函数

3.1 函数的定义与声明:

函数声明(原型)一般放在文件顶部,定义在文件底部(如:

  1. int add(int a, int b); // 函数声明
  2. int add(int a, int b) { // 函数定义
  3. return a + b;
  4. }
复制代码

参数传递:
值传递:将参数的副本传入函数。
引用传递:通过指针传递,直接修改原始数据。

3.2 递归函数:

一个函数在其定义中调用自己。递归通常需要一个基准条件来避免无限循环。
示例:计算阶乘的递归函数

  1. int factorial(int n) {
  2. if (n == 0) {
  3. return 1; // 基准条件
  4. } else {
  5. return n * factorial(n - 1); // 递归调用
  6. }
  7. }
复制代码

4 指针

4.1 指针的定义与使用

指针是一个变量,用于存储另一个变量的地址(如:

  1. int a = 10;
  2. int *p = &a; // p存储a的地址
复制代码

访问指针所指向的值可以使用解引用操作符*(如:printf(“%d\n”, *p);)。

指针与数组:

数组名实际上是指向数组第一个元素的指针(如:int arr[5]; int *ptr = arr;)。

动态内存分配:

使用malloc和free管理动态内存:

  1. int *arr = (int*)malloc(5 * sizeof(int)); // 动态分配内存
  2. free(arr); // 释放内存
复制代码

函数指针:

可以将函数的地址赋给指针,使用该指针调用函数(如:

  1. void (*funcPtr)(int) = &myFunction;
  2. funcPtr(5);
复制代码

5. 数组与字符串

5.1 数组

一维数组:相同类型元素的集合(如:

  1. int arr[5] = {1, 2, 3, 4, 5};
复制代码

多维数组:数组的数组(如:

  1. int matrix[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
复制代码

字符串:

字符串在C语言中实际上是字符数组,以空字符\0结束(如:

  1. char str[20] = "Hello";
  2. 常用字符串处理函数:
  3. strlen():计算字符串长度。
  4. strcpy():复制字符串。
  5. strcmp():比较两个字符串。
复制代码

6 结构体与联合体

6.1 结构体

用于封装不同类型的数据(如:
c
struct Student {
char name[50];
int age;
float grade;
};
struct Student s1 = {“Alice”, 20, 85.5};

联合体

允许在同一内存位置存储不同类型的数据,但只能使用一个(如:

  1. union Data {
  2. int i;
  3. float f;
  4. char str[20];
  5. };
  6. union Data data;
  7. data.i = 10; // 只会存储这个值
复制代码

7 .文件处理

7.1 文件的打开与关闭:

使用fopen打开文件,使用fclose关闭文件(如:

  1. FILE *fp = fopen("file.txt", "r");
  2. fclose(fp);
复制代码

读写文件:

fprintf():格式化写入文件。
fscanf():从文件读取格式化输入。
示例:

  1. FILE *fp = fopen("file.txt", "w");
  2. fprintf(fp, "Hello, World!\n");
  3. fclose(fp);
复制代码

错误处理:

检查文件是否成功打开(如:

  1. if (fp == NULL) {
  2. perror("Error opening file");
  3. }
复制代码

8 预处理指令

8.1 头文件包含

使用#include指令引入标准库或用户自定义的头文件(如:

  1. #include <stdio.h>
  2. #include "myheader.h"
复制代码

宏定义:

使用#define创建常量或宏函数(如:

  1. #define PI 3.14
  2. #define SQUARE(x) ((x) * (x))
复制代码

条件编译

使用#ifdef、#ifndef、#if、#else、#elif和#endif来控制代码的编译。
示例:

  1. #define DEBUG
  2. #ifdef DEBUG
  3. printf("Debug mode\n");
  4. #else
  5. printf("Release mode\n");
  6. #endif
复制代码

文件包含:

#include用于引入头文件,可以是标准库或自定义的头文件。使用尖括号<>表示系统头文件,使用双引号""表示用户自定义头文件。

  1. #include <stdio.h> // 系统头文件
  2. #include "myfile.h" // 用户自定义头文件
复制代码

9 错误处理与调试

9.1 错误处理

C语言使用返回值和全局变量errno来处理运行时错误。通过检查函数调用的返回值来判断是否发生了错误。
使用perror()函数:

可以打印出错误信息,通常用于文件操作失败后。

  1. FILE *fp = fopen("nonexistent.txt", "r");
  2. if (fp == NULL) {
  3. perror("Error opening file");
  4. }
复制代码

调试技巧:

使用assert()宏进行断言检查,确保程序在运行时满足特定条件。

  1. #include <assert.h>
  2. assert(x > 0); // 如果x不大于0,程序将终止,并显示错误信息
复制代码

10 C语言标准库

常用标准库:
:输入输出操作。
:内存管理、随机数生成等。
:字符串处理。
:数学计算,例如三角函数、对数等。

11 程序结构与风格

11.1 程序结构:

C语言程序一般由多个功能模块组成,每个模块可以用函数实现,主函数main()是程序的入口点。
良好的编程风格:

使用有意义的变量名。
保持一致的缩进风格和代码布局。
添加注释以提高代码可读性。
将复杂逻辑分解为简单的函数。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

特级红客

关注
  • 3221
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行