
C语言
千锋教育官方博客
千锋教育一直秉承“做真实的自己,用良心做教育”的理念,致力于打造IT教育全产业链人才服务平台。面授课程包含HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算+信息安全培训、全栈软件测试培训、大数据+人工智能培训、物联网+嵌入式培训、Unity游戏开发培训、区块链、PHP全栈+服务器集群培训、网络安全、红帽RHCE认证,采用全程面授高品质、高体验培养模式,教学大纲紧跟企业需求,拥有全国一体化就业保障服务,成为学员信赖的IT职业教育品牌。
-
转载 【Postman】12 Postman monitor功能使用
通过前面的文章,我们已经能完成接口的Collection,添加断言,Data文件数据驱动,设置变量(Data、Globals和Environment)等等方法,对我们的接口进行个各种的测试,保证其正确性。但是还可能有这么一个场景,突然某一天用户反应说我们的网站访问不了了,这时候,那帮程序猿查日志的查日志,看数据库的看数据库,当找到原因的时候,系统已经是发布上线后的几个小时啦,这对用户体验来说是很不好的。那我们能不能对接口做一个监控呢?如果接口有问题,给对应的程序猿发个邮件通知,这样我们就能做到在客户2020-08-06 14:14:35580
1
-
转载 C语言最新面试题系列二
1.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)2.写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。3. 预处理器标识#error的目的是什么?4.嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?5. 用变量a给出下面的定义6. 关键字static的作用是什么?7.关键字const是什么含意?8. 关键字volatile有什么含意 并给出三个不同的例子9.嵌入式系统总是要用户对变量或寄存器进行位操作。给定一个整型...2020-08-05 13:42:31702
1
-
转载 C语言最新面试题系列三
1、-1,2,7,28,,126请问28和126中间那个数是什么?为什么?2、用两个栈实现一个队列的功能?要求给出算法和思路!3、在c语言库函数中将一个字符转换成整型的函数是atool()吗,这个函数的原型是什么?4、二维字符数组与一维字符指针数组的差异5、操作系统的内存分配一般有哪几种方式,各有什么优缺点?6、操作系统的致命错误有哪些?7、有结构AA,中间有cc域,比较这两种对cc引用的不同:pp,qq各应如何定义?pp->cc, qq.cc答案区:1、第一题的2020-08-05 13:42:22656
1
-
转载 C语言学习路线图
C语言是当代人学习及生活中的必备基础知识,应用十分广泛,下面为大家带来C语言基础知识梳理总结,C语言零基础入门绝对不是天方夜谭!1、环境篇(ubuntu 系统安装 及环境调试)学习内容:ubuntu 虚拟机安装以及嵌入式开发环境搭建ubuntu 物理机及 u 盘版安装ubuntu 与 windos 等其它系统互访服务配置安装编辑器、编译器、调试器安装及使用2、环境篇(Linux 常用命令)Linux 日常高频率应用命令使用练习 、文件操作命令使用练习 、内容检索命令使用练习压缩解压命令使用2020-08-05 13:42:04730
1
-
转载 C语言最新面试题系列之c语言内存问题
1、问题:内存使用 有人写了一个将整数转换为字符串的函数:char *itoa (int n){ char retbuf[20]; sprintf(retbuf, "%d", n); return retbuf;} 如果我调用这个函数:char *str5 = itoa(5),str5会是什么结果呢? 答案分析: 答案是不确定,可以确定的是肯定不是我们想要的 “5”。 retbuf定义在函数体中,是一个局部变量,它的内存空间位于栈(stack)中的某个位置,其作2020-08-05 13:41:56692
1
-
原创 C语言最新面试题系列之c语言底层操作问题
概述 C语言的内存模型基本上对应了现在von Neumann(冯·诺伊曼)计算机的实际存储模型,很好的达到了对机器的映射,这是C/C++适合做底层开发的主要原因,另外,C语言适合做底层开发还有另外一个原因,那就是C语言对底层操作做了很多的的支持,提供了很多比较底层的功能。 下面结合问题分别进行阐述。 1、问题:移位操作 在运用移位操作符时,有两个问题必须要清楚: (1)、在右移操作中,腾空位是填 0 还是符号位; (2)、什么数可以作移位的位数。 答案与分析:2020-08-05 13:41:41599
1
-
转载 面试挖坑题系列—第一季
1、下面的程序可以从0....n-1中随机等概率的输出m个不重复的的数。这里我们假设n远大于m。ningth(int n,int m){ srand((unsigned int)time(0)); for(int i=;i<n;i++){ if(?){ count<<i<<endl; (?); } }}A.rand()%(n-i)<=m;m--;B.rand()%(n-i)<m;m--;C.rand()%(n-i)&g2020-08-04 10:06:24730
1
-
转载 一文带你了解static 和const
static 是c++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因、作用谈起,全面分析static 修饰符的实质。static 的两大作用:一、控制存储方式: static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间。 1、引出原因:函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次2020-08-04 10:06:15640
1
-
转载 解锁GitHub(6)之高效使用Github寻找开源项目并学习
目录:一、搜索规范及实例二、如何看开源项目一、搜索规范及实例# 按照项目名/仓库名搜索(大小写不敏感)in:name xxx# 按照README搜索(大小写不敏感)in:readme xxx# 按照description搜索(大小写不敏感)in:description xxx# stars数大于xxxstars:>xxx# forks数大于xxxforks:>xxx# 编程语言为xxxlanguage:xxx# 最新更新时间晚于YYYY-MM-DDpush2020-08-04 10:06:01678
1
-
转载 解锁GitHub(5)之GitHub本地仓库使用
目录:一、上传文件二、搜索仓库文件三、下载/检出项目四、Github Issues使用五、收藏功能六、关注功能七、fork功能一、上传文件二、搜索仓库文件三、下载/检出项目四、Github Issues使用作用:发现代码BUG,但是目前没有成型代码,需要讨论时用;或者使用开源项目出现问题时使用情景:张三发现李四开源git库,则发提交了一个issue;李四隔天登录在github主页看到通知并和张三交流,最后关闭issue五、收...2020-08-04 10:05:53691
1
-
转载 解锁GitHub(4)之GitHub注册和介绍
前边几篇文章简单介绍了一下git,今天补充GitHub的注册使用。目录:一、注册初始设置二、主页面介绍三、创建文件四、文件的修改和删除五、如何查看操作记录呢?一、注册初始设置1、注册帐号(简单)按照要求输入账号、邮箱、密码注册就好。附上注册网址:Build software better, togethergithub.com2、初始设置注册完成后,选择个人Free免费账号,完成设置。3、开始第一步新建一个工程4、开始第二步,新建一个仓库两种2020-08-04 10:04:11706
2
-
转载 详解数组的下标
提到数组,我想你肯定不陌生,甚至还会自信地说,它很简单啊。是的,在每一种编程语言中,基本都会有数组这种数据类型。不过,它不仅仅是一种编程语言中的数据类型,还是一种最基础的数据结构。尽管数组看起来非常基础、简单,但是我估计很多人都并没有理解这个基础数据结构的精髓。在大部分编程语言中,数组都是从 0 开始编号的,但你是否下意识地想过,为什么数组要从 0 开始编号,而不是从 1 开始呢? 从 1 开始不是更符合人类的思维习惯吗?你可以带着这个问题来学习接下来的内容。如何实现随机访问?什么是数组?我估计你心中已2020-08-03 10:54:14901
1
-
转载 不同编程语言的魅力
题目:输入两个整数 a,b,输出它们的和。注意:Pascal 使用 integer 会爆掉哦!有负数哦!C/C++ 的 main 函数必须是 int 类型,而且最后要 return 0。C语言:C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类2020-08-03 10:53:54680
0
-
转载 解锁GitHub(1)git和GitHub关系
先从概念上理解git版本控制(Version control):顾名思义,版本控制系统是任何能让你了解到一个文件的历史,以及它的发展过程的系统。它是一个用于 Linux内核开发的版本管理工具,是可以在你电脑不联网的情况下,只在本地使用的一个版本管理工具,其作用就是可以让你更好的管理你的程序,比如你原来提交过的内容,以后虽然修改了,但是通过git这个工具,可以把你原来提交的内容重现出来,这样对于你后来才意识到的一些错误的更改,可以进行还原。与常用的版本控制工具 CVS, Subversion 等不2020-08-03 10:53:45697
0
-
转载 解锁GitHub(2)git工具的安装与配置
一、git概念、特点以及作用概念:git是一个代码协同管理工具,用的最多的两种管理工具:snv、git分布式代码协同管理工具git:每一个结点都保存完整的代码,没有统一的中央服务器,节点之间相互推送下载代码完成代码共享。集中式代码协同管理工具:代码集中管理,每次完成的代码上传到中央管理器,然后再统一从中央管理器中下载代码使用。特点:git可以管理各种文件,特别是代码项目,多在linux和unix系统中使用是分布式管理,不同于集中式,这是git和svn的核心区别git可以很好的支持分支2020-08-03 10:53:36685
0
-
转载 解锁GitHub(3)git工具的使用 涛哥
在使用git之前,先来大概了解下这个工具的操作流程本地仓库:是git init之后出现的.git文件夹工作区:mkdir myproject之后,myproject就是工作区暂存区:就是工作区想要备份本地仓库的必经之路远程仓库:github1、基本操作(1)初始化仓库(在某个目录下初始化仓库后会自动产生.git目录,改目录下工作的所有文档可使用git进行管理)git init (2)查看文件、分支状态git status(3)将指定的文件提交到暂存区g2020-08-03 10:53:25732
0
-
转载 如何用c语言和GTK写一个扔色子的程序?
今来写一个简单版本的扔色子的程序。如果只用C语言来写,就随机数就可以了,现在加上了图形界面,代码如下:#include <gtk/gtk.h>#include <time.h>static GtkWidget *ourgif;gint i = 0;int flag=0;void change_bmp(){ srand(time(NULL)); i = rand() % 6; //取值范围是0~5 if(flag==0){ g_print("flag=2020-07-31 09:37:49854
1
-
转载 gtk当中一些好玩的小例子
之前有人问我,为什么要学习gtk?原因很简单:首先,GTK是C语言实现的。我们需要明白,对于C程序员而言,大部分都没有接触过图形界面编程,但是对于以后的发展,我们很有必要了解一下图形界面编程。那么问题又来了,我们是学C语言的,我们可能不太乐意学习面向对象语言(如 C++, Java, C#, Objective-C 等),现在市场上流行的图形界面工具库基本上都是用面向对象语言开发的。再者,对于我们 C 程序员,我们可能只需了解一下图形界面开发过程,并不一定以后从事图形界面开发。所以,GTK是一个很2020-07-31 09:37:37861
1
-
转载 详解c++中字符指针数组的使用
指针数组,就指向指针的指针,很早以前在说指针的时候说过,但后来发现很多人还是比较难以理解,这一次我们再次仔细说一说指向指针的指针。先看下面的代码,注意看代码中的注解:#include <iostream> #include <string> using namespace std; void print_char(char* array[],int len);//函数原形声明 void main(void) { //---------2020-07-31 09:37:28864
1
-
转载 虚拟机无法上网之修改Ubuntu更新源
大家虚拟机安装ubuntu系统后,有些会出现无法上网问题,如果是连接不到网络,可以参考下篇文章。VM虚拟机不能上网的问题解决_运维_Aaron_Zhang939的博客-CSDN博客blog.csdn.net还有一种情况是连接超时问题,这种情况一般是修改Ubuntu更新源就能解决。一般直接百度Ubuntu更新源就能出来一大堆,这时候最好是找和自己Ubuntu版本一致的更新源,我的Ubuntu版本是16.04,下面是我找到的一个比较好的更新源,并附上更换步骤:下面是更换步骤:1 备份原来的2020-07-31 09:37:20793
1
-
转载 线程间同步互斥(4)信号量使用
接下来。来看一看信号量的使用。概念部分:信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 0 时,则可以访问,否则将阻塞。PV 原语是对信号量的操作,一次 P 操作使信号量减1,一次 V 操作使信号量加1。函数接口部分:#include <semaphore.h>// 初始化信号量int sem_init(sem_t *sem, int2020-07-31 09:37:12795
1
-
转载 const修饰指针和引用释疑
今天来说说const修饰指针和引用,接下来从三个部分来说:const修饰指针,const修饰引用,const修饰指针的引用.一、const修饰指针const修饰指针又可分为三种情况:const修饰指针本身const修饰指针所指的变量(或对象)const修饰指针本身和指针所指的变量(或对象)1.const修饰指针本身这种情形下,指针本身为常量,不可改变,任何修改指针本身的行为都是非法的.例如:const int a = 1; const int b = 2; int i =2020-07-30 10:05:48827
1
-
转载 文件传输软件WinSCP的使用
WinSCP软件是windows下的一款使用ssh协议的开源图形化SFTP客户端,也就是一个文件传输的软件,它有什么优点吗?咱们嵌入式开发中经常会将windows中的文件复制到linux系统当中,比较常用的方式就是添加共享文件夹,每次通过添加的共享文件夹来相互传输文件,这里介绍的是一款能够跨系统使用的文件传输软件。软件的安装很简单,与其他软件一样直接安装即可,一直下一步就可以,当安装完软件后,打开软件,会看到一下界面此时,它会让你输入一些信息,主机名就是当前linux用户的IP地址,注意2020-07-30 10:05:39856
1
-
转载 纯C语言实现bootloader
之前有用很少一部分汇编实现过bootloader,但经过后来慢慢改进,发现是可以用纯C语言实现嵌入式操作系统的引导。下面是之前对不能完全使用C语言引导系统的几点说明:1、C程序中所有的代码都是以函数的形式出现,而函数定义通常会用到参数和在函数里面定义一堆局部变量,而这些变量一旦过多时,寄存器就无法全部保存,此时就会将剩下的变量存到堆栈里面,即,SP寄存器所指向的内存里面,而此时的SP寄存器并未赋初值,也就没有确切的内存地址可用。所以需要用到堆栈的前提是SP堆栈指针已经有了明确指向,否则就是非法访问内2020-07-30 10:05:23838
1
-
转载 线程间同步互斥(3)条件变量使用
今来看看条件变量的使用!!!与互斥锁不同,条件变量是用来等待而不是用来上锁的。条件变量用来自动阻塞一个线程,直 到某特殊情况发生为止。通常条件变量和互斥锁同时使用。条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步 的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起另一个线程使 “条件成立”(给出条件成立信号)条件的检测是在互斥锁的保护下进行的。线程在改变条件状态之前必须首先锁住互斥量。如果一个条件为假,一个线程自动阻塞,并释放等待状态改2020-07-30 10:05:05859
1
-
转载 线程间同步互斥(2)读写锁使用
概念:允许多个读出,但只允许一个写入的需求。读写锁与互斥量类似,不过读写锁允许更改的并行性,也叫共享互斥锁。互斥量要么是锁住状态,要么就是不加锁状态,而且一次只有一个线程可以对其加锁。读写锁可以有3种状态:读模式下加锁状态、写模式加锁状态、不加锁状态。读写锁使用步骤:1、定义:pthread_rwlock_t rwlock;2、初始化:3、上锁3.1申请读锁3.2申请写锁4、解锁5、销毁读写锁例子:要实现的功能是验证通过读写锁实现,读线程2020-07-30 10:04:55840
1
-
原创 利用c++实现的贪吃蛇游戏
在tc 3.0下调试通过,因为tc 3.0不支持bool 类型,所以程序中自定义了个枚举类型变量bool 如果在vc或者bc中运行,可以把这个bool类型注释掉. 贪吃蛇的核心算法时如何实现移动和吃掉食物.没有碰到食物的时候,把当前运动方向上的下个节点入队,并以蛇节点的颜色重绘这个节点. 然后把头指针所指的节点出队,并以游戏框架内部背景色重绘出队的节点,这样就可以达到移动的效果. 而在吃到食物的时候,则只需把食物入队即可.// greedsnake.cpp #include &2020-07-29 10:27:371401
2
-
原创 数据结构之队列的顺序存储以及实现
之前咱们已经学习了数据结构的最基本的线性表的顺序存储和链式存储,以及线性表中经常使用的栈的顺序存储和链式存储,今天咱们主要学习的是队列的顺序存储,注意的地方是,队列也是线性表的一种,所以也是一对一的存在,在使用过程中,一定要主要它的特点。接下来,咱们就来看一下主要内容。1. 定义队列是限制在两端进行插入操作和删除操作的线性表,允许进行存入操作的一端称为“队尾”,允许进行删除操作的一端称为“队头”。当线性表中没有元素时,称为“空队”。2. 特点先进先出(FIFO)。3. 队列的定义(12020-07-29 10:22:40927
1
-
原创 数据结构之栈的链式存储以及实现
对于栈的链式存储,其实咱们之前已经给大家分享过了,其实栈的链式存储和单链表(线性表的链式存储)是一样的,但是栈符合的特性是后进先出,所以需要考虑的是如何实现出栈和入栈。那么通过之前的学习,相信大家应该知道了,其实入栈和出栈就相当于单链表的头插法和头删法,这样实现的话就简单多了,具体代码如下。插入操作和删除操作均在链表头部进行,链表尾部就是栈底,栈顶指针就是头指针。(1)定义栈节点 linkstack_t(2)创建一个空的栈 linkstack_create( )(3)入栈 links2020-07-29 10:22:29840
1
-
原创 Const的几大用法(常用)
今天来看看const的用法。第一:常变量变量用const修饰,其值不得被改变。任何改变此变量的代码都会产生编译错误。Const加在数据类型前后均可。例如:void main(void){ const int i = 10; //i,j都用作常变量 int const j = 20; i = 15; //错误,常变量不能改变 j = 25; //错误,常变量不能改变}第二:常指针const跟指针一起2020-07-29 10:22:23871
1
-
原创 堆和栈的区别(经典版)
一、预备知识—程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的2020-07-29 10:22:09882
1
-
转载 常用排序算法(c语言篇)
最近重新回顾了一下数据结构和算法的一些基本知识,简单整理下C语言下的常见排序算法。选择排序selectSort选择排序是最简单的一种基于O(n2)时间复杂度的排序算法,基本思想是从i=0位置开始到i=n-1每次通过内循环找出i位置到n-1位置的最小(大)值void selectSort(int arr[], int n){ int i, j , minValue, tmp; for(i = 0; i < n-1; i++) { minValue2020-07-28 13:46:39819
0
-
转载 C++面试题总结(一)
1. 面向对象的程序设计思想是什么?答:把数据结构和对数据结构进行操作的方法封装形成一个个的对象。2. 什么是类?答:把一些具有共性的对象归类后形成一个集合,也就是所谓的类。3. 对象都具有的两方面特征是什么?分别是什么含义?答:对象都具有的特征是:静态特征和动态特征。静态特征是指能描述对象的一些属性(成员变量),动态特征是指对象表现出来的行为(成员函数)4. 在头文件中进行类的声明,在对应的实现文件中进行类的定义有什么意义?答:这样可以提高编译效率,因为分开的话只需要编译一次2020-07-28 13:44:23948
1
-
转载 C++引用之给已有的变量取个别名
1、引用的概述引用是c++对c的重要扩充。在c/c++中指针的作用基本都是一样的,但是c++增加了另外一种给函数传递地址的途径,这就是按引用传递(pass-by-reference),它也存在于其他一些编程语言中,并不是c++的发明。变量名实质上是一段连续内存空间的别名,是一个标号(门牌号) 程序中通过变量来申请并命名内存空间 通过变量的名字可以使用存储空间对一段连续的内存空间只能取一个别名吗? c++中新增了引用的概念,引用可以作为一个已定义变量的别名。 基本语法: Type& .2020-07-28 13:44:16954
0
-
转载 C++面试题总结(二)
51. 引用与指针有什么区别?答 :1) 引用必须被初始化,指针不必。2) 引用初始化以后不能被改变,指针可以改变所指的对象。3) 不存在指向空值的引用,但是存在指向空值的指针。52. 描述实时系统的基本特性答 、在特定时间内完成特定的任务,实时性与可靠性。54. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?答 、全局变量储存在静态数据区,局部变量在堆栈中。55. 堆栈溢出一般是由什么原因导致的?答 、没有回收垃圾资源56. 什么函数不能声明为虚函数?2020-07-28 13:43:59898
0
-
转载 c++中的动态数组使用
C++的new操作符是该语言一个非常好的语法特性,然而实际使用中却发现new操作符有不少限制,为突出的一点便是用new操作符分配多维数组空间时,不能让数组的每一维都动态可变。本文将对此提出一个简单直观的解决方案,在一个实际问题的简化模型中加以说明,并以此释清许多初学者对C++中new操作符与多维数组的误区。1. 问题的提出--多维可变数组的实际用途 下面是实际编程中遇到问题的一个简化模型。ChessBoard是一个棋盘类,其中的m_board是用来保存棋盘上棋子信息的二维数组。DIMENSION是2020-07-28 13:43:37824
0
-
转载 C++引用之用法详解
1、引用作为函数的参数void my_swap1(int a,int b){ int tmp = a; a = b; b=tmp;}void my_swap2(int *a,int *b)//a=&data1,b =data2;{ int tmp = *a; *a = *b; *b = tmp;}void my_swap3(int &a, int &b)//a=data1,b=data2{ int tmp = a; a =2020-07-27 13:28:08836
0
-
转载 代码编写小窍门(解决复制粘贴带行号问题)
大家在初学编程的 时候,经常会从网上复制部分代码,但偶尔复制的情况不尽如人意,比如下边这种情况: 1 #include<stdio.h> 2 #include<signal.h> 3 #include<unistd.h> 4 #include<stdlib.h> 5 #include<fcntl.h>2020-07-27 13:28:00962
0
-
转载 守护进程的创建
1.概念守护进程也称精灵进程,是在后台运行的一种特殊进程,它脱离控制终端并且周期性的执行某种任务或者等待某种事件的发生,脱离终端是为了避免进程在执行过程中的信息在任何终端上显示,并且进程也不会被任何终端产生的中断信息所终止;linux下的大多 服务器都是用守护进程实现的。比如internet 的inted 和wed 服务器httpd2.创建守护进程的一般步骤(1)调用umask重设文件权限掩码文件权限掩码:指屏蔽掉文件权限中的对应位。例如,有个文件权限掩码为050,它就屏蔽掉了文件组拥有者的2020-07-27 13:27:43849
0
-
转载 编程语言的最终梦想:静态类型安全
什么是类型安全?类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一点儿的程序员可能使用类型相当安全的语言写出类型不太安全的程序。绝对类型安全的编程语言暂时还没有。常听人说“强类型2020-07-27 13:27:35867
0