【技术积累】C语言中的基础知识【三】

打印 上一主题 下一主题

主题 864|帖子 864|积分 2592

什么是C语言【了解即可】

C语言是一种通用的高级编程语言,由美国贝尔实验室的Dennis Ritchie在20世纪70年代早期开发出来的。它在计算机科学和软件工程领域中被广泛使用。
C语言具有以下特点:
1. 简洁高效:C语言的语法相对简洁,易于理解和学习。它没有过多的高级特性和复杂的语法结构,具有很高的执行效率。
2. 可移植性强:C语言可以在不同的平台上进行编译和运行,具有很好的可移植性。一份C语言程序可以在多个操作系统和计算平台上运行而无需修改。
3. 底层控制能力强:C语言直接面向计算机的底层,允许程序员对内存和硬件进行直接的控制和操作,能够实现高效的系统级编程。
4. 强大的功能扩展性:C语言可以通过调用库函数来实现各种功能,并具有方便的扩展性。可以根据需要编写自定义函数库,以提供特定功能的支持。
5. 丰富的数据类型和运算符:C语言支持各种基本的数据类型(如整型、字符型、浮点型等),并提供丰富的运算符(如算术、逻辑、位运算符等),能够满足不同的编程需求。
6. 低级别的操作能力:C语言允许直接对内存进行操作,通过使用指针来实现底层的数据结构和算法,提供了更高的灵活性和效率。
7. 可重用性强:C语言的模块化特性使得程序员可以将程序分解为多个函数,每个函数都可以独立编译和测试,可以在其他项目中重复使用,提高了代码的可重用性。
8. 方便的与其他语言交互:C语言可以方便地与其他高级语言(如C++、Python等)进行交互,通过调用外部函数或使用特定的接口,可以实现不同语言之间的函数调用和数据传递。
总体而言,C语言是一种功能强大、灵活性高并且易于学习和使用的编程语言,适用于系统级开发、嵌入式系统、驱动程序和性能要求较高的应用程序。
它是学习计算机科学和软件开发的重要基础,也是研究和开发许多关键技术的基石。
什么是编译器,C语言的编译过程是什么样的

C语言的编译过程主要分为以下几个步骤:

  • 预处理(Preprocessing):预处理器(Preprocessor)将对源代码进行预处理,包括处理宏定义、包含头文件、条件编译等操作。预处理器会生成一个经过预处理的源代码文件。
  • 编译(Compilation):编译器(Compiler)将预处理后的源代码文件翻译成汇编语言。编译器会进行词法分析、语法分析、语义分析和优化等操作。这一步生成的汇编语言代码是与特定平台相关的。
  • 汇编(Assembly):汇编器(Assembler)将汇编语言代码翻译成目标文件,目标文件中包含了可执行指令以及必要的数据和符号表等信息。目标文件是机器可以直接执行的二进制代码。
  • 链接(Linking):链接器(Linker)将目标文件与运行时库文件进行合并,解析和解决各个目标文件间的符号引用关系,生成最终的可执行文件。链接器还可以进行地址重定位、符号重定位等操作,最终生成的可执行文件可以在特定平台上运行。
编译器是一种将高级语言源代码翻译成目标代码(通常是机器代码)的软件工具。它将源代码进行词法分析、语法分析、语义分析和代码优化等过程,生成目标文件或可执行文件。编译器具有将高级语言翻译成低级语言的功能,能够处理变量、函数、表达式等,并将其转化为底层计算机可以理解的指令。编译器还可根据编程语言的特性进行一些优化,提高程序的执行效率。值得注意的是,编译器是与具体语言相关的,不同的编程语言需要使用相应的编译器进行编译。
C语言编写格式

C语言的编写格式如下:
完整代码示例:
  1. #include <stdio.h>
  2. int main() {
  3.    return 0;
  4. }
复制代码
1. #include :这行代码用于引入标准输入输出库,以便在程序中使用输入输出函数。
2. int main():这是C语言程序的入口函数,也是程序执行的起点。
3. {}:大括号用于界定代码块,其中的代码将会被视为main函数的内容。
4. return 0;:这是main函数的返回语句。在C语言中,0通常表示程序成功执行,而非0则表示程序出现错误。
这段代码是一个最简单的C语言程序,其中除了引入了标准输入输出库和定义了一个空的main函数,没有其他具体操作。执行这段代码时,程序会从main函数开始执行,然后立即返回0,表示程序成功执行。
编写C语言程序时,还需要注意以下几点:
- C语言是大小写敏感的,所以关键字如"int"和函数名如"main"必须使用正确的大小写。
- 代码中的语句必须以分号(;)结尾。
- 代码的缩进和空格使用不是强制要求的,但是良好的缩进风格能够使代码更易读。
- 在编写复杂的程序时,可以将代码划分到多个函数中,如定义其他函数来执行具体的操作,然后在main函数中调用这些函数。
- C语言程序中可以使用注释(// 或 /* */)来增加代码的可读性,注释部分的内容不会被编译器执行。
以上是C语言程序的基本编写格式和一些常见规范,具体的编写风格可以根据个人习惯和项目需求进行调整。
C语言中的输入输出

在C语言中,输入输出主要通过标准库函数来实现,其中最常用的函数是scanf和printf。
scanf函数用于从标准输入设备(如键盘)读取输入,而printf函数用于将输出打印到标准输出设备(如屏幕)。
下面是一个简单的代码案例,演示了如何使用scanf函数读取输入并使用printf函数进行输出:
  1. #include <stdio.h>
  2. int main() {
  3.    int number;
  4.    printf("请输入一个整数:");
  5.    scanf("%d", &number);
  6.    printf("你输入的整数是:%d\n", number);
  7.    
  8.    return 0;
  9. }
复制代码
在上面的代码中,首先使用printf函数输出提示信息,然后使用scanf函数读取一个整数,并将读取的值存储在名为number的变量中。最后,使用printf函数将读取的整数打印出来。
可以运行上述代码,并尝试在控制台中输入一个整数,然后查看输出结果。
C语言中的注释

在C语言中,注释用于对代码进行解释说明,对于其他开发者或者自己阅读代码时提供辅助信息。C语言中有两种类型的注释:单行注释(//)和多行注释(/* */)。
1. 单行注释(//):单行注释通常用于注释一行代码,可以放在代码行的末尾或者单独一行。单行注释以两个斜杠(//)开头,直到行末结束。
以下是一个使用单行注释的示例代码:
  1. #include <stdio.h>
  2. int main() {
  3.     int num1 = 10;  // 初始化一个整数变量num1为10
  4.     int num2 = 20;  // 初始化一个整数变量num2为20
  5.     // 计算两个数的和并输出结果
  6.     int sum = num1 + num2;
  7.     printf("Sum: %d", sum);
  8.     return 0;
  9. }
复制代码
在上面的代码中,使用了单行注释对代码进行了解释,使其更易于理解。
2. 多行注释(/* */):多行注释通常用于注释一段较长的代码或者注释某个代码块。多行注释以 /* 开始,以 */ 结束,中间的部分都被注释掉。
以下是一个使用多行注释的示例代码:
  1. #include <stdio.h>
  2. /*
  3. 这是一个用来打印"Hello, World!"的简单程序
  4. */
  5. int main() {
  6.     printf("Hello, World!");
  7.     return 0;
  8. }
复制代码
在上面的代码中,使用了多行注释来注释程序的整个说明。这种注释可以提供有关程序的整体功能和设计思路的详细信息。
注释对代码的可读性和可维护性非常重要,它们可以帮助其他开发人员和自己更好地理解代码。无论是单行注释还是多行注释,都应该尽量清晰、准确地解释代码的含义和目的。
C语言中的数据类型有哪些

在C语言中,常见的数据类型包括整型、浮点型、字符型和指针类型。
整型(Integer):整型数据类型用于存储整数值。在 C 语言中,有不同的整型类型,包括带符号和无符号类型。常见的整型类型有:

  • int:用于存储整数值,通常占用4个字节的空间,取决于编译器和平台。
  • short:用于存储较小范围的整数值,通常占用2个字节的空间。
  • long:用于存储较大范围的整数值,通常占用至少4个字节的空间。
  • long long:用于存储更大范围的整数值,占用至少8个字节的空间。
浮点型(Floating-point):浮点型数据类型用于存储浮点数(小数)。在 C 语言中,有两种常见的浮点型类型:

  • float:用于存储单精度浮点数,通常占用4个字节的空间。
  • double:用于存储双精度浮点数,通常占用8个字节的空间。
字符型(Character):字符型数据类型用于存储单个字符。在 C 语言中,字符型使用 char 关键字。char 类型的变量通常占用一个字节的空间。
指针类型(Pointer):指针类型用于存储变量的内存地址。指针变量包含另一个变量的内存地址,而不是存储实际的值。在 C 语言中,指针类型使用 * 符号进行声明。例如,int* 表示一个指向整型变量的指针。指针可以通过 & 运算符获取变量的地址,并使用 * 运算符访问指针指向的变量的值。
 
下面是一个案例,展示了这些不同数据类型的用法和定义:
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. int main() {
  4.     // 整型数据类型
  5.     int num = 10;
  6.     printf("整型: %d\n", num);
  7.     short shortInt = 20;
  8.     printf("短整型: %hd\n", shortInt);
  9.     long longInt = 30;
  10.     printf("长整型: %ld\n", longInt);
  11.     long long longLongInt = 40;
  12.     printf("长长整型: %lld\n", longLongInt);
  13.     // 无符号整型
  14.     unsigned int unsignedInt = 50;
  15.     printf("无符号整型: %u\n", unsignedInt);
  16.     // 浮点型数据类型
  17.     float decimal = 3.14;
  18.     printf("浮点型: %f\n", decimal);
  19.     double doubleDecimal = 6.28;
  20.     printf("双精度浮点型: %lf\n", doubleDecimal);
  21.     // 字符型数据类型
  22.     char character = 'A';
  23.     printf("字符型: %c\n", character);
  24.     // 布尔型数据类型
  25.     bool boolean = true;
  26.     printf("布尔型: %d\n", boolean);
  27.     // 指针类型
  28.     int *pointer = &num; // 定义指向整型变量的指针
  29.     printf("指针类型: %p\n", pointer);
  30.     return 0;
  31. }
复制代码
C语言中的变量和常量

定义常量

在C语言中,可以使用#define预处理命令或者使用const关键字来定义常量。
使用#define预处理命令定义常量的语法如下:
  1. #define 常量名 常量值
复制代码
例如:
  1. #define PI 3.1415926
复制代码
在上述代码中,将常量名PI定义为3.1415926。
使用const关键字定义常量的语法如下:
  1. const 数据类型 常量名 = 常量值;
复制代码
例如:
  1. const int MAX_VALUE = 100;
复制代码
在上述代码中,将常量名MAX_VALUE定义为100,类型为整数类型。
声明变量

在C语言中,可以在函数内部或者全局范围内声明变量。在函数内部声明的变量称为局部变量,只在函数内部有效。在函数外部声明的变量称为全局变量,对整个程序都有效。
声明变量的语法如下:
  1. 数据类型 变量名;
复制代码
例如:
  1. int age;
  2. float salary;
复制代码
在上述代码中,分别声明了整型变量age和浮点型变量salary。
变量赋值

在C语言中,可以使用赋值运算符将值赋给变量。
变量赋值的语法如下:
  1. 变量名 = 表达式;
复制代码
例如:
  1. age = 25;
  2. salary = 5000.00;
复制代码
在上述代码中,将整型变量age赋值为25,将浮点型变量salary赋值为5000.00。
代码块示例:
  1. #include <stdio.h>
  2. #define PI 3.1415926
  3. int main() {
  4.     const int MAX_VALUE = 100;
  5.     int age;
  6.     float salary;
  7.     age = 25;
  8.     salary = 5000.00;
  9.     printf("PI: %f\n", PI);
  10.     printf("MAX_VALUE: %d\n", MAX_VALUE);
  11.     printf("age: %d\n", age);
  12.     printf("salary: %.2f\n", salary);
  13.     return 0;
  14. }
复制代码
在上述示例代码中,定义了一个常量PI,并在主函数内部声明了一个常量MAX_VALUE、一个整型变量age和一个浮点型变量salary。然后通过赋值运算符将age赋值为25,salary赋值为5000.00。最后使用printf函数输出这些常量和变量的值。输出结果如下:
  1. PI: 3.141593
  2. MAX_VALUE: 100
  3. age: 25
  4. salary: 5000.00
复制代码
C语言中的运算符

C语言中包含了多种运算符,可以根据其功能将其分为以下几类:
算术运算符

算术运算符主要用于执行基本的数学运算。
常用的算术运算符有加法运算符(+)、减法运算符(-)、乘法运算符(*)、除法运算符(/)和求余(取模)运算符(%)。它们的基本用法如下:
  1. #include <stdio.h>
  2. int main() {
  3.     int a = 10;
  4.     int b = 5;
  5.     int c;
  6.     c = a + b;  // 加法运算
  7.     printf("a + b = %d\n", c);
  8.     c = a - b;  // 减法运算
  9.     printf("a - b = %d\n", c);
  10.     c = a * b;  // 乘法运算
  11.     printf("a * b = %d\n", c);
  12.     c = a / b;  // 除法运算
  13.     printf("a / b = %d\n", c);
  14.     c = a % b;  // 求余运算
  15.     printf("a %% b = %d\n", c);
  16.     return 0;
  17. }
复制代码
赋值运算符

赋值运算符用来给变量赋值。
常用的赋值运算符是等号(=)。
它的基本用法如下:
  1. #include <stdio.h>
  2. int main() {
  3.     int a = 10;
  4.     int b;
  5.     b = a;  // 将a的值复制给b
  6.     printf("b = %d\n", b);
  7.     return 0;
  8. }
复制代码
关系运算符

关系运算符用于比较两个值的关系,并返回结果为真(1)或假(0)。

常用的关系运算符有相等运算符(==)、不等运算符(!=)、大于运算符(>)、小于运算符(=)和小于等于运算符( b) {        printf("a 大于 b\n");    } else {        printf("a 不大于 b\n");    }    if (a < b) {        printf("a 小于 b\n");    } else {        printf("a 不小于 b\n");    }    if (a >= b) {        printf("a 大于等于 b\n");    } else {        printf("a 小于 b\n");    }    if (a  0 && b > 0) {        printf("a 和 b 都大于 0\n");    }    if (a > 0 || b > 0) {        printf("a 和 b 中至少有一个大于 0\n");    }    if (!(a > 0)) {        printf("a 不大于 0\n");    }    return 0;}[/code]位运算符

位运算符用于对整数的位进行操作。
常用的位运算符有按位与运算符(&)、按位或运算符(|)、按位异或运算符(^)和取反运算符(~)。
它们的基本用法如下:
  1. #include <stdio.h>
  2. int main() {
  3.     int a = 10;
  4.     int b = 5;
  5.     if (a == b) {
  6.         printf("a 等于 b\n");
  7.     } else {
  8.         printf("a 不等于 b\n");
  9.     }
  10.     if (a != b) {
  11.         printf("a 不等于 b\n");
  12.     } else {
  13.         printf("a 等于 b\n");
  14.     }
  15.     if (a > b) {
  16.         printf("a 大于 b\n");
  17.     } else {
  18.         printf("a 不大于 b\n");
  19.     }
  20.     if (a < b) {
  21.         printf("a 小于 b\n");
  22.     } else {
  23.         printf("a 不小于 b\n");
  24.     }
  25.     if (a >= b) {
  26.         printf("a 大于等于 b\n");
  27.     } else {
  28.         printf("a 小于 b\n");
  29.     }
  30.     if (a <= b) {
  31.         printf("a 小于等于 b\n");
  32.     } else {
  33.         printf("a 大于 b\n");
  34.     }
  35.     return 0;
  36. }
复制代码
移位运算符

移位运算符用于对整数进行位移操作。
常用的移位运算符有左移运算符()。它们的基本用法如下:
  1. #include <stdio.h>
  2. int main() {
  3.     int a = 10;
  4.     int b = 5;
  5.     if (a > 0 && b > 0) {
  6.         printf("a 和 b 都大于 0\n");
  7.     }
  8.     if (a > 0 || b > 0) {
  9.         printf("a 和 b 中至少有一个大于 0\n");
  10.     }
  11.     if (!(a > 0)) {
  12.         printf("a 不大于 0\n");
  13.     }
  14.     return 0;
  15. }
复制代码
条件运算符

条件运算符,也叫三元运算符,用于根据条件选择执行不同的语句。它的基本用法如下:
  1. #include <stdio.h>
  2. int main() {
  3.     unsigned int a = 60;       // 00111100
  4.     unsigned int b = 13;       // 00001101
  5.     unsigned int c = 0;
  6.     c = a & b;  // 按位与运算
  7.     printf("a & b = %d\n", c); // 输出为 12
  8.     c = a | b;  // 按位或运算
  9.     printf("a | b = %d\n", c); // 输出为 61
  10.     c = a ^ b;  // 按位异或运算
  11.     printf("a ^ b = %d\n", c); // 输出为 49
  12.     c = ~a;     // 取反运算
  13.     printf("~a = %d\n", c);    // 输出为 -61
  14.     return 0;
  15. }
复制代码
以上是C语言中常见的运算符及其基本用法的介绍和代码案例。
C语言中的控制结构

C语言中有三种基本的控制结构:顺序结构、选择结构和循环结构。

  • 顺序结构:程序按照代码的书写顺序一行一行地执行。这是最基本的结构,程序会依次执行每一条语句,没有跳转或分支。
  • 选择结构:

    • if语句:根据条件的真假来选择执行不同的代码块。
    • if-else语句:根据条件的真假来选择执行不同的代码块,如果条件为假,则执行else代码块中的代码。
    • if-else if-else语句:根据多个条件的真假来选择执行不同的代码块,每一个条件都会依次被检查,如果其中一个条件为真,则执行相应的代码块。
    • switch语句:根据表达式的值选择执行不同的代码块,可以使用case语句来匹配不同的值。

  • 循环结构:

    • while循环:在条件为真的情况下,重复执行一段代码块,每次循环都会根据条件判断是否继续执行。
    • do-while循环:首先执行一段代码块,然后在条件为真的情况下重复执行这段代码块,每次循环都会根据条件判断是否继续执行。
    • for循环:包含初始化、循环条件和迭代语句的循环结构,可以控制循环的次数。
    • 嵌套循环:在一个循环内部包含着另一个循环。

这些控制结构可以根据具体的业务逻辑和需求进行组合和嵌套,以实现复杂的程序逻辑和控制流程。
C语言中的选择结构

在C语言中,常见的选择结构有条件语句(if语句)、多重条件语句(if-else语句)和switch语句。
1. 条件语句(if语句):当某个条件为真时,执行一段代码。
   代码案例:
  1. #include <stdio.h>
  2. int main() {
  3.     int a = 5;
  4.     int b = a << 2;  // 左移运算
  5.     printf("a 左移 2 位:%d\n", b); // 输出为 20
  6.     int c = a >> 1;  // 右移运算
  7.     printf("a 右移 1 位:%d\n", c); // 输出为 2
  8.     return 0;
  9. }
复制代码
2. 多重条件语句(if-else语句):当某个条件为真时执行一段代码,否则执行另一段代码。
   代码案例:
  1. #include <stdio.h>
  2. int main() {
  3.     int a = 10;
  4.     int b = 5;
  5.     int max;
  6.     max = (a > b) ? a : b;  // 如果 a 大于 b,则max等于a;否则max等于b
  7.     printf("较大的数:%d\n", max);
  8.     return 0;
  9. }
复制代码
3. switch语句:根据不同的表达式值,选择不同的代码分支进行执行。
switch语句的执行流程如下:

  • 先计算表达式的值。
  • 将表达式的值与每个case后的常量进行比较,如果匹配成功,则执行与该case关联的代码块,否则继续比较下一个case。
  • 如果匹配成功的case后面没有break语句,程序会继续执行下一个case中的代码块(不进行匹配),直到遇到break语句或者switch语句结束。
  • 如果所有的case都与表达式的值不匹配,且存在default语句,那么会执行default后面的代码块。
  • 如果没有default语句,并且没有匹配成功的case,那么switch语句不会执行任何代码块。
  1.    #include <stdio.h>
  2.    int main() {
  3.       int num = 10;
  4.       if (num > 0) {
  5.          printf("Number is positive\n");
  6.       }
  7.       return 0;
  8.    }
复制代码
在以上代码中,当num的值为2时,输出结果为 "Number is 2"。
如果num的值是1,输出结果为 "Number is 1",如果num的值是3,输出结果为 "Number is 3"。
如果num的值不是1、2、3中的任意一个,输出结果为 "Number is not 1, 2 or 3"。
以上是C语言中常见的选择结构。根据不同的条件,程序可以选择执行不同的代码分支,从而实现更灵活的控制流程。
C语言中的循环结构

在C语言中,有以下几种循环结构:
1. while循环:通过判断条件来重复执行一段代码块,直到条件不成立退出循环。
  1.    #include <stdio.h>
  2.    int main() {
  3.       int num = 10;
  4.       if (num > 0) {
  5.          printf("Number is positive\n");
  6.       } else {
  7.          printf("Number is negative\n");
  8.       }
  9.       return 0;
  10.    }
复制代码
2. do...while循环:先执行一段代码块,然后再判断条件是否成立,如果条件成立则继续执行循环,否则退出循环。
  1. #include <stdio.h>
  2. int main() {
  3.     int num = 2;
  4.    
  5.     switch (num) {
  6.         case 1:
  7.             printf("Number is 1\n");
  8.             break;
  9.         case 2:
  10.             printf("Number is 2\n");
  11.             break;
  12.         case 3:
  13.             printf("Number is 3\n");
  14.             break;
  15.         default:
  16.             printf("Number is not 1, 2 or 3\n");
  17.     }
  18.    
  19.     return 0;
  20. }
复制代码
3. for循环:在指定的初始条件下,重复执行一段代码块,然后每次循环结束后更新循环控制变量,直到不满足循环条件退出循环。
  1. int i = 0;
  2. while (i < 5) {
  3.   printf("i = %d\n", i);
  4.   i++;
  5. }
复制代码
4. 嵌套循环:在循环结构内部再嵌套一个或多个循环结构,用于处理多维数组或多次迭代的问题。
  1. int i = 0;
  2. do {
  3.   printf("i = %d\n", i);
  4.   i++;
  5. } while (i < 5);
复制代码
5. break语句:在循环结构内部,可以使用break语句跳出当前循环,立即结束循环的执行。
  1. for (int i = 0; i < 5; i++) {
  2.   printf("i = %d\n", i);
  3. }
复制代码
6. continue语句:在循环结构内部,可以使用continue语句跳过本次循环的剩余代码,继续执行下一次循环。
  1. for (int i = 0; i < 3; i++) {
  2.   for (int j = 0; j < 2; j++) {
  3.     printf("i = %d, j = %d\n", i, j);
  4.   }
  5. }
复制代码
C语言中的goto语句

在C语言中,goto语句是一种跳转语句,它允许程序根据特定条件无条件地跳转到程序中的某个标签位置。该标签位置通常是被定义在程序的其他位置。
goto语句在C语言中的作用如下:
1. 跳转到特定位置:使用goto语句,可以直接跳转到程序中的某个标签位置,避免了通过循环或条件判断语句来实现跳转的复杂性。这在某些情况下可以提高程序的可读性和简化代码的结构。
2. 退出嵌套循环:当需要在嵌套循环中提前退出所有循环时,使用goto语句可以直接跳转到循环外部的标签位置。这比使用多层循环结构和标志位等方法更简洁。
3. 处理错误或异常情况:通过goto语句,可以直接跳转到错误处理或异常处理的代码段,从而方便地处理错误或异常情况,提高程序的健壮性。
4. 简化代码逻辑:通过合理使用goto语句,可以将代码跳转逻辑更加清晰地表达出来,避免了使用过多的条件判断语句或复杂的循环结构。
[code]#include int main() {    int num;    printf("请输入一个大于10的数字:");    scanf("%d", &num);    if (num
回复

使用道具 举报

0 个回复

正序浏览

快速回复

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

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表