『C语言入门』初识C语言

文章目录

  • 前言
  • C语言简介
  • 一、Hello World!
    • 1.1 编写代码
    • 1.2 代码解释
    • 1.3 编译和运行
    • 1.4 结果
  • 二、数据类型
    • 2.1 基本数据类型
    • 2.2 复合数据类型
    • 2.3 指针类型
    • 2.4 枚举类型
  • 三、C语言基础
    • 3.1 变量和常量
    • 3.2 运算符
    • 3.3 控制流语句
    • 3.4 注释
      • 单行注释
      • 多行注释
      • 注释的作用
  • 四、 函数
    • 4.1 函数的声明和定义
    • 4.2 函数的参数和返回值
    • 4.3 函数的调用
    • 4.4 主函数(main函数)
    • 4.5 内置函数和自定义函数
  • 五、 数组和字符串
    • 5.1 数组的声明和初始化
    • 5.2 多维数组
    • 5.3 字符串
    • 5.4 字符串处理函数
    • 5.5 字符串输入和输出
  • 六、 指针和内存管理
    • 6.1 指针的概念
    • 6.2 指针的运算
        • 6.3 动态内存分配
        • 6.4 指针和数组的关系
  • 七、文件操作和输入/输出
    • 7.1 文件操作
    • 7.2 格式化输入/输出
    • 7.3 标准输入/输出
  • 八、错误处理和调试
    • 8.1 错误代码
    • 8.2 断言
    • 8.3 调试器
    • 8.4 日志和打印调试信息
  • 结语

前言

在这个数字化时代,计算机编程已经成为连接人类与技术的桥梁。而在编程的世界中,C语言犹如一座承载着无限可能性的基石。作为计算机编程的经典之选,C语言无疑是每个刚刚踏入编程领域的初学者的理想起点。本篇博客将带您踏上一段奇妙的C语言学习之旅,不仅会教您编写代码,更会启发您深入思考计算机科学的精髓。

C语言简介

C语言是一门古老而强大的编程语言,诞生于20世纪70年代初由丹尼斯·里奇(Dennis Ritchie)在贝尔实验室开发而成,C语言一经问世,立即在计算机科学领域引起轰动。其简洁、灵活和高效的特性,使其成为了许多编程任务的首选语言。

C语言既具备高级编程语言的抽象特性,又直接暴露了底层的计算机硬件操作。这种特性使得C语言不仅适用于应用程序的开发,还可用于系统级编程和嵌入式系统的构建。实际上,许多操作系统和编译器本身就是用C语言编写的。🌟

C语言的语法简洁而灵活允许程序员进行精细的控制和优化。它提供了丰富的数据类型,包括整数、浮点数、字符等,以及数组、结构体和指针等数据结构,使得程序员可以更好地管理和组织数据。此外,C语言也支持低级的内存操作,使得程序员可以直接操作计算机内存,从而实现高效的算法和数据结构。💡

尽管C语言在很多方面表现出色,但它也需要程序员自己负责管理内存,这可能会导致一些错误和挑战。然而,正是这些挑战培养了程序员的深刻理解和技能,使他们能够编写更加健壮和高性能的程序。

一、Hello World!

在学习任何编程语言时,第一个示例程序通常是经典的"Hello, World!"。它是一个简单的程序,可以帮助你了解基本的语法和程序结构。让我们一起来编写你的第一个C语言程序吧!

1.1 编写代码

打开你选择的集成开发环境(IDE)或者文本编辑器,创建一个新的源代码文件,文件名可以是hello.c。然后在文件中输入以下代码:

#include <stdio.h>int main() {printf("Hello, World!\n");return 0;
}

1.2 代码解释

#include <stdio.h>

这是一个预处理指令。预处理器会在编译代码之前执行,它告诉编译器引入了名为stdio.h标准输入输出库。这个库包含了用于处理输入输出的函数,如printf

int main() {

这是C语言程序的入口点。所有C程序都必须包含一个名为main的函数,它是程序的起始执行点int表示main函数将返回一个整数值。

    printf("Hello, World!\n");

这行代码使用**printf函数打印文本到控制台。printf是C语言中用于格式化输出的函数**。括号内的内容是你要输出的文本,\n表示换行

    return 0;
}

return语句用于指定函数的返回值。main函数中通常使用return 0;表示程序执行成功。其他非零值可能表示程序遇到了错误。

要理解代码的执行过程,你可以将程序想象成一系列的步骤:

  1. 预处理器会处理**#include <stdio.h>,并将stdio.h**中的内容添加到程序中,以便在程序中使用标准输入输出函数。
  2. 当程序开始执行时,它会跳转main函数。main函数是程序的起始点
  3. 在**main函数中,printf("Hello, World!\n");**语句会执行。printf函数会将指定的文本打印到控制台。
  4. return 0;表示main函数执行成功,并返回整数值0,这表示程序正常终止
  5. 整个程序执行完毕,控制台会显示出你的"Hello, World!"消息。

1.3 编译和运行

保存文件后,你可以使用IDE中的编译和运行按钮,或者通过命令行运行以下命令来编译和运行程序:

gcc -o hello hello.c
./hello

第一条命令使用GCC编译器将hello.c源文件编译为可执行文件hello。第二条命令运行生成的可执行文件。

1.4 结果

如果一切顺利,你应该能够在控制台看到输出:

Hello, World!

恭喜你,你已经成功编写并运行了你的第一个C语言程序!"Hello, World!"程序可能非常简单,但它为你提供了学习C语言的一个良好起点。在接下来的学习中,你将逐步了解更多复杂的语法和概念。

二、数据类型

当你开始学习编程语言时,了解数据类型至关重要,因为数据类型定义了变量可以存储的数据种类和范围。在C语言中,有多种基本数据类型,每种类型在内存中占据不同的空间并具有不同的取值范围。以下是一些常见的C语言数据类型的简介:

2.1 基本数据类型

  • 整数类型:用于存储整数值,分为有符号和无符号两种。有符号整数可以表示正数、负数和零,而无符号整数只能表示非负数(正数和零)。常见整数类型有:
    • int:常规整数,根据平台占用不同字节
    • short:短整数,占用较少字节。
    • long:长整数,占用较多字节。
    • unsigned intunsigned shortunsigned long:无符号整数。
  • 浮点类型:用于存储小数或实数值,包括单精度和双精度。常见浮点类型有:
    • float:单精度浮点数,占用4字节。
    • double:双精度浮点数,占用8字节。
  • 字符类型:用于存储单个字符,通常使用char数据类型。

2.2 复合数据类型

  • 数组:由相同类型的元素组成的集合,通过索引访问。例如:int scores[5]; 定义一个包含5个整数的数组。
  • 联合体(Union):类似结构体,但成员共享相同内存,只能存储一个成员的值,节省内存。
  • 结构体:将不同类型的数据组合成自定义的复合数据类型。例如:
struct Student {char name[50];int age;float gpa;
};

2.3 指针类型

指针:存储变量内存地址,使你能直接访问内存中的数据。指针类型变量可指向特定数据类型。例如:int *ptr; 定义指向整数的指针。

2.4 枚举类型

枚举:定义用户自定义数据类型,限制变量可能取值范围。例如:

enum Day {MONDAY,TUESDAY,WEDNESDAY,// ...
};

掌握各种数据类型将帮助你更好地管理数据,有效地创建变量,并确保程序正确性和性能。在C语言中,选择适当的数据类型对于正确使用变量、执行算术运算以及在程序中传递参数至关重要。

三、C语言基础

3.1 变量和常量

  • 变量:在程序中用于存储数据的容器,需要声明并指定其数据类型。
int num;
  • 常量:值不可更改的变量,在声明时必须初始化,可以使用const关键字来声明常量。
const double pi = 3.14159;

3.2 运算符

  • 算术运算符:用于执行基本算术操作,如加法、减法、乘法和除法。
int sum = 10 + 5;
  • 赋值运算符:用于给变量赋值,将右边的值赋给左边的变量。
int x = 5;
  • 比较运算符:用于比较两个值,返回布尔值(真或假)。
if (x > 0) {// ...
}
  • 逻辑运算符:用于组合和操作布尔值,如与、或和非。
if (x > 0 && y < 10) {// ...
}

3.3 控制流语句

  • 条件语句(if-else):根据条件的真假来执行不同的代码块。
if (score >= 60) {printf("Pass\n");
} else {printf("Fail\n");
}
  • 循环语句:重复执行一段代码,有三种主要类型:forwhiledo-while
for (int i = 0; i < 5; i++) {printf("%d\n", i);
}

3.4 注释

单行注释

单行注释用于在一行代码后添加说明。它从//开始,一直到该行的末尾。编译器会忽略这些注释,不会将其包含在生成的可执行文件中。

int age = 25;  // 声明并初始化年龄变量

多行注释

多行注释用于跨越多行代码的解释。它从/\*开始,到\*/结束。多行注释可以包含多行文本,并且可以用于注释掉一整段代码。

在这里插入图片描述

注释的作用

  • 解释代码:注释可以提供代码的解释和上下文,帮助其他人理解你的代码。这对于团队协作和代码维护非常重要。
  • 记笔记:你可以使用注释来记录你的想法、思路以及需要后续处理的问题。这有助于你在以后的开发中快速回顾和处理。
  • 调试:在调试时,你可以使用注释来排除一些代码,以确定问题是否出现在特定部分。
  • 临时更改:如果你想临时禁用某些代码,你可以使用注释来实现,而无需实际删除这些代码。

四、 函数

函数是C语言中的基本构建块之一,它们允许你将一段代码封装为可重用的模块,并通过调用函数来执行特定任务。使用函数可以使你的代码更加模块化、结构化和易于维护。以下是关于函数的一些重要概念:

4.1 函数的声明和定义

在使用函数之前,需要先声明它。函数声明告诉编译器有一个函数存在,但不提供函数的具体实现。函数定义提供了函数的实际代码。例如:

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

4.2 函数的参数和返回值

函数可以接受参数,执行特定的操作,然后返回一个值。参数是传递给函数的输入值,而返回值是函数执行后的输出结果。

int square(int x) {return x * x;
}

4.3 函数的调用

通过函数名和传递的参数调用函数。调用函数会执行函数的代码,并将返回值返回给调用处。

int result = square(5); // 调用square函数,计算5的平方

4.4 主函数(main函数)

每个C程序都必须包含一个名为main的函数。程序从main函数开始执行,当main函数执行完毕时,程序终止。

int main() {// 主函数的代码return 0;
}

4.5 内置函数和自定义函数

C语言提供了许多内置函数,如数学函数、字符串处理函数等。此外,你也可以创建自己的函数来执行特定任务。

五、 数组和字符串

在C语言中,数组和字符串是常用的数据结构,用于存储一组相关的数据。数组是相同类型元素的有序集合,而字符串是字符数组的特殊形式。以下是关于数组和字符串的重要内容:

5.1 数组的声明和初始化

数组的声明需要指定元素的数据类型和元素数量。可以通过下标(索引)访问数组中的元素。

int scores[5]; // 声明一个包含5个整数的数组
scores[0] = 85; // 为数组元素赋值

也可以在声明时进行初始化:

int numbers[3] = {10, 20, 30}; // 声明并初始化一个包含3个整数的数组

5.2 多维数组

多维数组是数组的扩展,可以是二维、三维或更多维度的数组。它们通常用于表示矩阵、表格等数据结构。

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

5.3 字符串

字符串是字符的数组,以null终止字符(‘\0’)作为字符串的结尾。

char greeting[] = "Hello, world!";

5.4 字符串处理函数

C语言提供了许多字符串处理函数,用于处理字符串的操作,如连接、比较、复制等。

#include <string.h>char source[] = "Hello";
char destination[10];strcpy(destination, source); // 复制source到destination

5.5 字符串输入和输出

使用scanf函数从用户输入中读取字符串,使用printf函数将字符串输出到控制台。

char name[50];
printf("请输入你的名字:");
scanf("%s", name);
printf("你好,%s!\n", name);

数组和字符串是C语言中用于存储和操作数据的重要工具。它们在各种编程场景中都得到广泛应用,从简单的存储数据到处理复杂的文本信息。理解数组和字符串的特性和使用方法将有助于你更高效地编写程序。

六、 指针和内存管理

在C语言中,指针是一个重要的概念,它允许你直接访问内存中的数据,并提供了更高级的内存管理能力。以下是关于指针和内存管理的重要内容:

6.1 指针的概念

指针是存储内存地址的变量。通过指针,你可以直接访问存储在内存中的数据。

int num = 42;
int *ptr;       // 定义一个指向整数的指针
ptr = &num;     // 将指针指向num的地址

6.2 指针的运算

指针可以进行加法和减法运算,以访问相邻内存单元的数据。

int numbers[5] = {10, 20, 30, 40, 50};
int *ptr = numbers; // 将指针指向数组的第一个元素int thirdValue = *(ptr + 2); // 访问数组的第三个元素,即30

6.3 动态内存分配

C语言允许你在运行时动态分配内存,这样你可以根据需要分配和释放内存。

int *dynamicArray = malloc(5 * sizeof(int)); // 分配一个包含5个整数的动态数组// 使用dynamicArrayfree(dynamicArray); // 释放分配的内存

6.4 指针和数组的关系

数组名实际上是指向数组第一个元素的指针。因此,可以使用指针来访问数组元素。

int numbers[3] = {10, 20, 30};
int *ptr = numbers;int firstValue = *ptr; // 数组的第一个元素,即10
int secondValue = *(ptr + 1); // 数组的第二个元素,即20

指针和内存管理是C语言的核心概念之一,了解它们将帮助你更好地理解内存的工作方式,提高代码的灵活性,并避免内存泄漏等问题。指针的使用虽然强大,但也需要小心谨慎,以避免出现错误。

七、文件操作和输入/输出

在C语言中,文件操作和输入/输出(I/O)是处理外部数据的关键部分。通过文件操作,你可以读取和写入文件,而输入/输出允许你与用户交互并处理文本。

7.1 文件操作

C语言中的文件操作涉及打开、读取、写入和关闭文件。你可以使用标准库函数来执行这些操作。

#include <stdio.h>int main() {FILE *filePointer;char data[100];filePointer = fopen("file.txt", "r"); // 打开文件以读取数据if (filePointer == NULL) {printf("无法打开文件\n");return 1;}fgets(data, 100, filePointer); // 从文件读取一行数据printf("%s", data);fclose(filePointer); // 关闭文件return 0;
}

7.2 格式化输入/输出

使用printfscanf函数,你可以格式化地输出数据到屏幕和从用户处输入数据。

#include <stdio.h>int main() {int age;printf("请输入你的年龄:");scanf("%d", &age);printf("你的年龄是:%d\n", age);return 0;
}

7.3 标准输入/输出

C语言中有三个标准的I/O流:stdin(标准输入)、stdout(标准输出)和stderr(标准错误输出)。

#include <stdio.h>int main() {fprintf(stdout, "这是标准输出\n");fprintf(stderr, "这是标准错误输出\n");return 0;
}

文件操作和输入/输出是C语言中处理外部数据的重要组成部分。它们使你能够读取和写入文件,与用户交互,并将程序的结果输出到屏幕上。掌握文件操作和I/O将使你能够创建更丰富的应用程序,能够与外部数据进行有效交互。

八、错误处理和调试

在编程过程中,错误是不可避免的。C语言提供了一些机制来处理错误并进行调试,以确保程序的正确性和稳定性。

8.1 错误代码

C语言中,通常使用返回值来指示函数是否执行成功,以及在错误发生时提供额外的信息。标准库函数通常会返回特定的错误代码。

#include <stdio.h>int main() {FILE *filePointer;filePointer = fopen("nonexistent_file.txt", "r");if (filePointer == NULL) {perror("无法打开文件");return 1;}fclose(filePointer);return 0;
}

8.2 断言

断言是在代码中添加的条件检查,用于确保程序在满足某些条件时继续执行。如果断言条件不满足,程序将中止并显示错误消息。

#include <assert.h>int main() {int x = 5;assert(x > 10); // 如果x不大于10,程序将中止return 0;
}

8.3 调试器

调试器是一种工具,用于追踪程序的执行过程并检查变量的值。在C语言中,你可以使用调试器来识别和修复错误。

8.4 日志和打印调试信息

在程序中添加打印语句或日志,可以帮助你追踪程序的执行,以及查找问题所在。

#include <stdio.h>int main() {int x = 42;printf("x的值:%d\n", x); // 打印调试信息return 0;
}

错误处理和调试是开发过程中必不可少的一部分。通过使用适当的错误处理机制和调试工具,你可以更轻松地识别和解决问题,确保程序的正确性和稳定性。

结语

通过这篇博客,我们深入了解了C语言的基础知识。从数据类型和变量到控制流语句,再到函数、数组、指针,以及文件操作和调试技巧,我们探索了C语言的核心概念和关键特性。C语言作为一门古老而强大的编程语言,为我们提供了处理底层细节和开发高效程序的工具。

虽然C语言可能对初学者来说有一些挑战,但通过不断的学习、练习和实践,你将逐渐掌握这门语言,并能够编写出高效、健壮的程序。无论是为了系统编程、嵌入式开发、还是学术研究,C语言都是一个极具价值的工具。

希望这篇博客能够帮助你在C语言的学习之旅中起到一些指引作用。在掌握了这些基础后,你可以继续深入学习更高级的主题,探索更多C语言的应用领域。祝愿你在编程的道路上取得巨大的成功!

如果你有任何问题或需要进一步的帮助,欢迎随时与我交流。继续努力,愿你在编程世界中探索无限可能!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/104155.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element表格多选实现

表格实现多选 实现表格多选很简单&#xff0c;只需要在表格里加上一列即可&#xff0c;加完之后就会在表格里出现一列白色的四方块按钮&#xff0c;可以多选&#xff0c;也可以单选 <el-table-columntype"selection"width"55"align"center"&…

iOS App逆向之:iOS应用砸壳技术

在iOS逆向&#xff0c;有一项关键的技术叫做“iOS砸壳”&#xff08;iOS App Decryption&#xff09;。自iOS 5版本以来&#xff0c;苹果引入了应用程序加密机制&#xff0c;使得大部分应用都需要进行砸壳操作才能进行逆向分析。因此作为开发者、逆向工程师和安全研究人员都需要…

Python Opencv实践 - 图像直方图自适应均衡化

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/cat.jpg", cv.IMREAD_GRAYSCALE) print(img.shape)#整幅图像做普通的直方图均衡化 img_hist_equalized cv.equalizeHist(img)#图像直方图自适应均衡化 #1. 创…

【动手学深度学习】--21.锚框

锚框 学习视频&#xff1a;锚框【动手学深度学习v2】 官方笔记&#xff1a;锚框 1.锚框 目标检测算法通常会在输入图像中采样大量的区域&#xff0c;然后判断这些区域中是否包含我们感兴趣的目标&#xff0c;并调整区域边界从而更准确地预测目标的真实边界框&#xff08;gro…

hive问题总结

往往用了很久的函数却只知道其单一的应用场景&#xff0c;本文将不断完善所遇到的好用的hive内置函数。 1.聚合函数或者求最大最小值函数搭配开窗函数使用可以实现滑动窗口 例&#xff1a; SELECT event,time,session_id,COLLECT_LIST(event) OVER (PARTITION BY session_id …

ChatGPT + Flutter快速开发多端聊天机器人App

下载地址&#xff1a;ChatGPT Flutter快速开发多端聊天机器人App 下载地址&#xff1a;ChatGPT Flutter快速开发多端聊天机器人App

PL 侧驱动和fpga 重加载的方法

可以解决很多的问题 时钟稳定后加载特定fpga ip &#xff08;要不内核崩的一塌糊涂&#xff09;fpga 稳定复位软件决定fpga ip 加载的时序 dluash load /usr/local/scripts/si5512_setup.lua usleep 30 mkdir -p /lib/firmware cp -rf /usr/local/firmare/{*.bit.bin,*.dtbo} …

Flutter实现动画列表AnimateListView

由于业务需要&#xff0c;在打开列表时&#xff0c;列表项需要一个从右边飞入的动画效果&#xff0c;故封装一个专门可以执行动画的列表组件&#xff0c;可以自定义自己的动画&#xff0c;内置有水平滑动&#xff0c;缩放等简单动画。花里胡哨的动画效果由你自己来定制吧。 功…

206.Flink(一):flink概述,flink集群搭建,flink中执行任务,单节点、yarn运行模式,三种部署模式的具体实现

一、Flink概述 1.基本描述 Flink官网地址:Apache Flink — Stateful Computations over Data Streams | Apache Flink Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。 2.有界流和无界流 无界流(流): 有定义流的开始,没有定义结束。会无休止…

【视频】Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析|数据分享...

全文下载链接&#xff1a;http://tecdat.cn/?p23544 在本文中&#xff0c;长短期记忆网络——通常称为“LSTM”——是一种特殊的RNN递归神经网络&#xff0c;能够学习长期依赖关系&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 本文使用降雨量数据&#xf…

Docker file解析

文章目录 简介构建的三步骤Docker执行Dockerfile的大致流程DockerFile常用保留字指令创建第一个Dockerfile镜像的缓存特性 Docker file 解析 简介 Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本&#xff0c;记录了镜像构…

ffmpeg,nginx,vlc把rtsp流转hls

ffmpeg:rtsp>hls流; nginx 托管hls流服务; vlc测试hls流服务; 参考了很多相关文档和资料,由于比较乱就不在一一引用介绍了&#xff0c;下面的是实操OK的例子&#xff1b; 1&#xff09;ffmpeg (ffmpeg-4.4.1-full_build)&#xff0c;要用full版本&#xff0c;否则会缺某些…

华为数通方向HCIP-DataCom H12-821题库(单选题:61-80)

第61题 关于 BGP 的Keepalive报文消息的描述,错误的是 A、Keepalive周期性的在两个BGP邻居之间发送 B、Keepalive报文主要用于对等路由器间的运行状态和链路的可用性确认 C、Keepalive 报文只包含一个BGP数据报头 D、缺省情况下,Keepalive 的时间间隔是180s 答案&#xff…

videojs 实现自定义组件(视频画质/清晰度切换) React

前言 最近使用videojs作为视频处理第三方库&#xff0c;用来对接m3u8视频类型。这里总结一下自定义组件遇到的问题及实现&#xff0c;目前看了许多文章也不全&#xff0c;官方文档写的也不是很详细&#xff0c;自己摸索了一段时间陆陆续续完成了&#xff0c;这是实现后的效果.…

MyBatis分页与特殊字符处理

文章目录 一、分页1.1 分页插件PageHelper1.2 使用1.2.1 导入pom依赖1.2.2 Mybatis.cfg.xml配置拦截器1.2.3. 配置 Mapper.xml1.2.4 测试 二、特殊字符处理2.1 使用CDATA区段2.2 使用实体引用 一、分页 1.1 分页插件PageHelper PageHelper 是 Mybatis 的一个插件。官网 Page…

ios小组件报错:Please adopt containerBackground API

iOS 17 小组件报错:Please adopt containerBackground API 使用下面的方法解决了: 代码: extension View {func widgetBackground(_ backgroundView: some View) -> some View {if #available(iOSApplicationExtension 17.0, *) {return containerBackground(for: .wi…

【云原生】Docker私有仓库 RegistryHabor

目录 1.Docker私有仓库&#xff08;Registry&#xff09; 1.1 Registry的介绍 1.2 Registry的部署 步骤一&#xff1a;拉取相关的镜像 步骤二&#xff1a;进行 Registry的相关yml文件配置&#xff08;docker-compose&#xff09; 步骤三&#xff1a;镜像的推送 2. Regist…

k8s 安装 istio(二)

3.3 部署服务网格调用链检测工具 Jaeger 部署 Jaeger 服务 kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.16/samples/addons/jaeger.yaml 创建 jaeger-vs.yaml 文件 apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata…

java 高级面试题整理(薄弱技术)

session 和cookie的区别和联系 session1.什么是session Session是另一种记录客户状态的机制&#xff0c;不同的是Cookie保存在客户端浏览器中&#xff0c;而Session保存在服务器上。客户端浏览器访问服务器的时候&#xff0c;服务器把客户端信息以某种形式记录在服务器上。这就…

常用的数据可视化工具有哪些?要操作简单的

随着数据量的剧增&#xff0c;对分析效率和数据信息传递都带来了不小的挑战&#xff0c;于是数据可视化工具应运而生&#xff0c;通过直观形象的图表来展现、传递数据信息&#xff0c;提高数据分析报表的易读性。那么&#xff0c;常用的操作简单数据可视化工具有哪些&#xff1…