C语言
文章平均质量分 57
C语言知识
17岁boy想当攻城狮
在时间的大钟上,只有两个字「现在」
展开
-
char、unsigned char、signed char之间的区别
但通常情况下我们也会使用unsigned char、signed char来明确表明我们的变量类型,在某些场景下例如我们的代码会跑在不同的平台上,为了确保结果与我们预期的一致而使用限定符来表明类型,这是一种保证预期结果的好方法。,我的个人理解是应该是为了可移植性,char的类型由编译器决定,这样可以统一在不同的平台上表现一致,但这仅限于你的数据是在额定范围之内。,语言相当于标准,而编译器是实现这些标准的实体,这样的类型一般是需要编译器来决定它是什么类型,此外像int与char也是一样,在。原创 2024-07-17 13:50:01 · 343 阅读 · 1 评论 -
C语言赋值浮点数时候立即数后面加上f的意义和注意事项
很明显结果是错误的,可以看到精度从第8位开始就错了,这是因为float的精度根据IEEE 754的标准,它只占7位有效位,为什么只占7位这里给大家补充一下这个知识,在IEE 754的标准里float占4字节,其中23位表示小数点,而23bit位(23^2)最大能表示的数为7位,所以它小数点后最大能表示7位。f在c语言里是为了区分单精度和双精度的浮点数数据,这一点大家在开发时应注意,不要因为书写习惯在一些双精度的浮点数里加上了f导致精度丢失了。原创 2024-07-15 10:55:59 · 834 阅读 · 2 评论 -
c++缓冲区同步原理与std::ios::sync_with_stdio作用
c++是基于c语言的扩展语言,本质上它继承了c语言许多特性,同时也继承了C语言特性,在c语言中stdio为输入输出缓冲区,stdin是输入缓冲区,stdout是输出缓冲区,C++不与C语言使用同一个缓冲区,这就出现了一个问题,当使用printfcouttest2test1可以看到test2早于test1输出了,这是因为c语言的机制,c语言缓冲区只有在遇到\n程序结束缓冲区满时才会刷新缓冲区。原创 2024-04-28 10:01:24 · 612 阅读 · 3 评论 -
c语言不使用加运算符做加法运算
我之前的博客里有讲到cpu是怎么做加减乘除的偶然间看到一个面试题说的是不用加法去做加运算其实仔细想想,就是以二进制的方式来运算咯,只不过把计算机组成原理里的那套搬到编程里来复习一下加法:cpu首先对加法的ADD指令是这样做的:比如0001+0001首先进行&运算等于0001+0001=0001 这里顺便复习一下与运算0&0=0,1&1=1,1&0或0&a...原创 2020-04-23 12:59:02 · 1166 阅读 · 1 评论 -
有趣的检查边界面试题
最近博主在某个群内有位程序员去面试遇到一个面试题:此宏函数用来检查存储边界的对齐,请输入?应该填写什么?#define UNA(x)((long)(x)&(?))博主刚开看还真有点郁闷不知道填什么,后面梳理了一下这句话:此函数用来检查存储边界的对齐,仔细看一下这段代码(long)(x)这段代码表示传递进来的值会被显示声明为long型也就是整数型其实也是显示的告诉编译器这个值是个整数(这样做...原创 2018-06-26 03:25:26 · 451 阅读 · 0 评论 -
字符串处理类库_CharString
CharString类库是SDT(Standard Development Toolkit 标准开发工具包)库中属于字符处理类库的函数,由博主自己开发的,跨平台,且纯C/C++实现,代码风格良好,逻辑思路清晰,且对指针以及内存管理方面严谨,适合初学者或者已经正在工作人员下载下来学习,或者运用到实际工作当中去,此类库也是博主在开发一个完整的大型WEB服务器架构中的一个模块,先逐步开源,这样就不止于日...原创 2019-02-22 01:21:54 · 647 阅读 · 0 评论 -
开源字符处理类库:CharString类 拆分自自己研发的web服务器中的类库
博主目前在做WEB服务器,众所周知WEB服务器最主要的是解析HTTP协议,其中最关键的是字符解析,也就是分割字符来确定每个字段所表达的意思,客户端的意愿!此类是博主在编写WEB服务器所写出来的,专门用于处理字符串,当然也可以用在其它地方,比如用它来写一个解析json字符串的功能也是绰绰有余!CharString类://未公开的库,字符进制转换#include <Shlwa...原创 2021-05-22 10:06:28 · 390 阅读 · 4 评论 -
C/C++函数调用约定
函数调用约定这些调用约定一般情况下会用在跨平台的编译器上,因为不同的编译器对函数的调用约定也不同!目前在C/C++里有4种函数调用约定,先从C语言开始介绍:一.__stdcall 这个属于C语言里默认的函数调用约定!函数调用约定:在调用指定函数时函数的参数入栈顺序是从右往左依次入栈!并且在传递参数数据时也是通过堆栈来传递,所开辟的栈空间由函数自己自动释放,函数中开辟的堆需要程序原创 2017-10-30 22:04:47 · 1069 阅读 · 0 评论 -
C语言可变参数讲解
一.可变参数简介: 什么是可变参数? 答:就是在函数声明时参数是...表示后面可以有多个不同类型的参数传递进来最著名的就是"printf",通过格式占位符来判断后面的参数类型!printf("%c,%d",'c',1);但是如果给:printf("%s%f",'c',2);就会打印不正确值,因为printf不会智能判断类型,只能通过占...原创 2019-02-22 02:43:11 · 961 阅读 · 2 评论 -
C语言实现水仙花数
什么水仙花数?水仙花数其实是自幂数的一种,自幂数是一个自然数中它每个个位上的数字n次方相加之和为它本身!,这里n可以称为立方指数!而水仙花数的n次方的n是3,这里3可以称为自然数的立方指数次方即为自身相乘多少次,一般用^表示,比如1的3次方表示为:1^3比如153这个数是一个水仙花数,为什么呢?下面我们用公式来看一下:153有三个数位1、5、31的三次方为1:1*1*1=1...原创 2019-03-25 14:00:47 · 22760 阅读 · 3 评论 -
使用c语言实现INI文件的读写
INI文件是Windows上独有的一种存储结构,这只是Windows下发明的存储结构,也有很多类似的,比如xml!就说一下TXT文本是按行读取,这就是它的格式!而xml是类似二叉树的带层次结构的存储方式INI则是以键值的方式将数据对应起来,类似数据库一样!在Windows上我们可以使用一些自带API实现对INI文件的读取写入,但是在其它系统平台上就不可以了,这里是博主在开发跨平...原创 2019-04-06 15:27:14 · 6036 阅读 · 1 评论 -
离散哈希表实现
前言:哈希表也叫离散表,在PHP内核中常用于记录变量值,其存储思路就是通过哈希算法计算Key值,然后取余,将余作为索引下标放到指定列表里去!这样的话极大降低了查找速度,因为链表是关系型存储结构,需要一步一步的Next才可以得到想要查找的数据,而哈希表则可以直接通过关联Key计算出数据的下标然后直接获取!就好像变量一样: int Test = 5;其中Test就是关联的Key,5就是...原创 2019-03-17 11:30:55 · 912 阅读 · 0 评论 -
数独详细实现过程
数独的游戏规则是:每一行每一列不能有出现重复数字!其实用c语言实现也很简单,主要的就是思路!这里我们编写两个函数,一个是用于生成,一个是用于解!1.生成://生成数独int** generate(int difficulty){}这里difficulty是表示每行要生成多少个数字,其返回值是一个二级指针,它指向一个二维数组if (difficulty > 9)...原创 2021-05-22 10:05:45 · 737 阅读 · 2 评论 -
c语言位操作的高级应用
c语言里下有丰富的位运算,它们能很好的帮助我们对位进行操作~、<<、>>、&、^、|、&=、^=、|=、<<=、>>=这些位运算里,常用的有就是:与运算(&),位移运算(<< >>),还有或运算和异或运算(|,^)许多c语言初学者可能只知道这些运算的意思,但是很少在实际编程中去用到它,其次是即便已经参与工作的程序员来说,也相对的较少用到它们,但是这些运算在Linux内核里非常容易见到,还有底层开发人原创 2020-08-04 17:02:40 · 766 阅读 · 0 评论 -
c语言格式化浮点数多余的0
当我们使用double或者float这样的浮点数类型时,输出时会把小数点后的0也一并输出,如:double test = 0.1f;输出时:0.10000000太多啦,我们使用“%g”占位符可以解决这个问题%g会格式化掉多余的0如:printf("%g",test);输出:0.1顺带一提,double类型与float类型格式化的符号是不一样的,double是“lf”,float是“f”double是双精度浮点数类型,也就是长浮点数类型,l代表长整型,f代表浮.原创 2020-08-27 09:48:32 · 4419 阅读 · 0 评论 -
一个多文件编程里.h文件定义static变量产生的问题
问题的产生是来源在写一个项目时产生的问题我起初先是采用多文件编程来完成某个项目,但是出现了每个内存中单独定义的问题起初我没有认为是这个问题的原因在于是多文件重复包含了,理论上应该报变量重复定义,但是编译器并没报重复定义的问题。当我把静态变量去除后,声明为普通的变量后就会报出重定义的问题当我把头文件卫士加上后也是如此这是我写的测试代码,复现了当时的情景:test.h#ifndef GL#define GLstatic int test = 0;extern void ini原创 2020-08-04 17:02:59 · 2592 阅读 · 4 评论 -
C语言printf中%s、%*s、%*.*s的作用以及实现一个进度条
这个比较特殊,首先前面的*代表至少输出多少个字符,如果少于这几个字符则在左边空格补齐。”符号,则认为是一个格式化标识符,它会自动读取下一个字符作为占位符,如果“”上下文中,那么后面一个字符就要求为宽度占位数。在c语言printf的解析格式里,如果遇到“个字符,所以又在左边用空格进行了补齐。”则取参数对应位作为宽度,如果是“第二个*代表最多输出多少个字符。所以这段参数的含义是至少输出。的原因,所以我们只能输出。个则在左边用空格来补齐。个字符,但最多只能输出。,意味着最多只能输出。原创 2022-09-10 20:53:21 · 9148 阅读 · 0 评论 -
架构师成长之旅_第一篇:插件与框架是什么?
致给即将踏入工作的程序员一封情书目录踏入工作前的准备 框架是什么? 多人开发 插件开发原创 2020-12-04 20:30:16 · 351 阅读 · 0 评论 -
一次函数(正比例函数)公式的解析式与C语言代码实现
一次函数也叫正比例函数,它的公式如下:这里简单分解一下,y是因变量,x是自变量,k与b都为常数。因变量受到自变量的变化而改变,与因果关系一样,当x发生变化时,y也会发生变化。这里以买书为例,将上面的公式拆开y=书的总价k=书的价格x=书的数量b=预付费的价格当我们去买一本书的时候,首先要知道书的价格,那么就是k,k这个数在开始推导时是无法改变的,就称为常数,那么我们就要知道要买几本书吧?那么就是x,x就代表了要买几本书,这个是由用户来改变的,因为我每次想买几本书就买几本书原创 2021-11-14 22:58:17 · 2924 阅读 · 0 评论 -
分数的全面解析式与在C语言中应用分数计算
分数的概念分数就是将一个整体拆分成多少份,并选其中的几份,也就是将1拆分。比如一个大蛋糕,我们看成一个整体“1”,并拆分成5份,就是将一整块蛋糕拆分成5小块,然后取其中的“3”分,写成分数就是:分数起源于古埃及,最初古埃及数学家发明一种公式,用来计算分东西的一些计算场景,就如开始说的分蛋糕,就是将1平均分成若干份,然后在选其中的几份,在不能拆分整数的情况下用一种新的公式来表示整数分成。分子写在分数线上面的数分母写在分数线下面的数整数与分数之间的转换如有“1000”个冰激凌原创 2021-11-21 18:26:22 · 2048 阅读 · 0 评论 -
如何在不接收返回值的情况下获取返回值?
在编程开发中,往往会声明一个函数来做特定的处理,然后通过返回值的方式获取函数处理结果!但是也可以通过二级指针的方式来得到返回值,从而无需用一个变量来接收返回值!int test(int **a){ int *b = (int *)malloc(1);//申请一个内存 *b = 1; //初始赋值 *b = *b+1; //进行三目运算 (*a) = b; //通过指针得到运算结果}i...原创 2018-05-10 16:24:02 · 804 阅读 · 0 评论 -
For循环执行顺序流程
有以下for循环执行代码较为基础,所以画图给大家讲解一下for循环执行步骤1.执行for循环体里的第一个参数,也就是定义一个int整形变量,其变量名为i,并初始化为02.执行完第一个参数里的代码后,会执行第二个参数,判断i是否小于993.当第二个表达式为True时会去执行循环体里的代码,也就是当i不等于99的时候4.执行完循环体里的代码后,就会去执行for循环的第三个参数也就是++i当以上流程执行...原创 2018-05-07 15:06:15 · 84551 阅读 · 14 评论 -
当字符变量作为函数参数时传递常量字符引发的问题
当我们将char数组或指针类型作为函数参数时,编译器为了节省内存,和提高效率会自动将参数转换为指针,指向形参的内存地址,间接引用!列如如下代码:int test(char str[256]){ return 0;}在编译之后,编译器会将其转换成指针:int test(char *str){ return 0;}所以无论你的数组大小是多大,最后都会被变成跟随编译器位数...原创 2018-04-03 16:23:57 · 5628 阅读 · 2 评论 -
详解,c/c++输入输出缓冲区,以及scanf回车的问题
一.输出缓冲区输出缓冲区是我们在dos窗口下,或终端下,linux/windows为我们分配的默认输出缓冲区大小,也就是窗口一次能容下多少字符!输出缓冲区大小是和图像一样的,用宽高来定义的,换句话说输出缓冲区就相当于一个小型屏幕,而屏幕的宽高由操作系统指定/用户,我们可以将我们程序运行时的一些数据输入到此缓冲区中,在屏幕中显示出来,列如(printf/cout)就是这样做的。输出缓冲区是当我们运行...原创 2018-04-02 18:43:19 · 3033 阅读 · 0 评论 -
volatile讲解与宏定义
在嵌入式面试时volatile是必考题!下面来解释一下volatile关键字的作用:volatile关键字,是用于表明变量代码无法被优化!比如:int a = 0;a = 1;a = 2;a = 3;经过编译器代码优化后:int a = 0;a = 3;省去重复工作,debug下不会作任何优化,但这样的代码效率一般只用在调试下,release模式下会对齐进行优化,在GCC的编译器下会直接对...原创 2018-05-24 17:52:51 · 1339 阅读 · 0 评论 -
程序局部性(时间局部性与空间局部性)与循环展开原理详解
前言程序局部性分为两个概念:时间局部性与空间局部性,它们俩的特性与编译器优化有关,编译器会将经常访问的内存地址或访问的内存地址相邻不大的区域放入到CPU的Cache缓存中,这样每次访问CPU直接从Cache中取数据,这样能大幅度提升程序效率。循环展开就是非常简单的,就是增加代码长度以提升循环速度。程序局部性时间局部性时间局部性的意思是当一块内存区域,每隔一段时间就会被访问,局部性的意思是程序中的某一小段,这句话可以从计算机角度理解是一个变量每隔几十ns里就会被访问,也就是编译器会推断,推原创 2021-11-11 11:41:55 · 6653 阅读 · 1 评论 -
printf实现
printf是c语言下非常常用的一个函数,几乎每个程序员在一开始第一个学的函数应该就是printf吧!今天来实现一个printf函数,虽然printf是我们常用的函数,但实现起来其实还是蛮考基础的!下面一步一步带大家实现:一. 编写一个入口函数并导入标准io头文件#include<stdin.h>int main(){}二. printf函数准备工作前言...原创 2019-03-06 08:33:02 · 5031 阅读 · 5 评论 -
C/C++三个标准设备文件句柄
在c/c++中定义了三个标准宏:stdout(Standardoutput)标准输出stdin(Standardinput)标准输入stderr(Standarderror)标准错误这些宏分别对应不同的设备句柄stdout对应的是屏幕,一般来说指的是终端窗口上的显示文字信息的屏幕!stdin对应的是输入缓冲区stderr和stdout对应的是一样的,这个宏是给perror使用的,这里就顺便补充一下...原创 2018-06-26 02:27:50 · 2114 阅读 · 0 评论 -
C/C++语言传参、返回参数知识点讲解
在我们编写程序时,大多数情况下都是函数传参,接收返回参数,但这中间有一定的操作系统内存传递原理,当你看完这篇文章你会发现,噢!原来这样使用会出错之类的感想!最简单的,函数现场保护,通常操作系统会使用call指令来调用函数,用ret返回上一个函数,中间需要将上一个函数的执行情况,以及返回地址写入到寄存器(根据架构不同看CPU如何选择寄存器)当中,供ret指令使用!考虑到看这篇文章的都是刚入门...原创 2019-02-11 06:54:14 · 1159 阅读 · 0 评论 -
i++与++i的区别+汇编分析
这是很多初级C/C++程序员最容易碰到的一个问题这里来给大家简明摘要的给大家讲解一下:i++i++是后递增有如下语句:int i = 0;printf("%d,",i++);在打印输出时会发现是0,上面也说了i++是后递增其意思就是在一条指令执行完成之后才会去对i这个变量进行递增printf("%d",i++);的执行流程如下:先printf打印i的值,在打印完成之后也就是语句结束时对i进行递增...原创 2018-05-07 15:57:00 · 3240 阅读 · 3 评论 -
C语言内存模型详细介绍_堆栈介绍
(命令行参数区其实就是在通过dos或shell脚本调用时传递的参数,比如:a.exe 123 123)上图是C语言内存模型,其实虽然说叫C语言内存模型,其实并不是叫C语言内存模型,而是C语言根据CPU处理器搭建出来的一个模型!在开始介绍这些之前,读者需要了解一些体系结构:冯诺依曼体系:把程序本身当作数据来对待,程序指令和该程序处理的数据用同样的方式储存。 冯·诺依曼体系结构的要点是:计算机的数制和...原创 2018-05-22 18:31:28 · 10090 阅读 · 2 评论 -
详解多维数组与指针之间的关系
先介绍一下简单的一维数组:列如:int a[3] = {0,1,2};[3]和类型int则明确表示编译器应该为这个栈分配多大的内存,也就是三个int大小!在内存中示意图是:在CPU看来内存是一组连续的地址空间,所以当我们对一维数组进行操作时只需要知道数组首地址,就可以通过地址偏移加减运算方式来求得每个元素位于内存中的文件映射出来的数据段虚拟地址!不过要注意不要越界,其实你在自己的地址空间内访问超出...原创 2018-04-16 18:22:43 · 10569 阅读 · 13 评论 -
一步一步使用标c编写跨平台图像处理库_让一个图像变成反向图像
接着上一章 一步一步使用标c编写跨平台图像处理库,本章将介绍如何让一个图像变成反向图,其原理非常简单,只需要让每个像素点上的RGB三色取反即可!变成负数!其公式为:s = -r-g-b转换方式:首先定义一个宏函数,其函数作用显而易见,是将一个整数转换成的负数signed明确告诉编译器转换后的类型是有符号的负数,但转换后类型不一定是signed,只是告诉编译器运算时以signed类型运算,倘若实际类...原创 2018-04-18 13:40:05 · 699 阅读 · 0 评论 -
c/c++开发技巧_常用do_while
在linux源码里可以经常看到do ... while(0)这样的写法,众所周知,do while 是一个特殊的循环语句,无论如何它都会执行一次才会去判断是否达到标准,那么do ... while(0) 也就是说无论如何都只会执行一次,那么这样做有何意义呢?可以从linux源码里一些简单的宏函数看出来,如这个宏函数:这个宏函数主要目的是为了将指针释放,并自动置空#define SAFE_FREE(p) do{ free(p); p = NULL;} while(0) 但是通常情况下,我们判原创 2020-12-15 15:11:40 · 337 阅读 · 0 评论 -
c/c++_消除非标准警告
在使用gcc/g++编译时,一旦不符合一些iso的规范编译器就会报出警告,我们每个人写法不同,虽然标准是最安全,最规范的写法,但是每个人还是有自己的风格。可以使用:__extension__ 标识符放到你的代码前,来消除编译器对这段代码的警告。用法:__extension__ 你的代码如果是多行,我们没必要一行一行前面都加__extension__可以使用作用域符号标注起来__extension__ { 你的代码}...原创 2020-12-21 15:41:12 · 434 阅读 · 0 评论 -
深度剖解“IF表达式”底层实现过程
“if表达式”绝大多数c/c++以及其他编程语言的编程人员来说一点都不陌生,几乎每天写代码都会用到这个条件表达式!大多数程序员都知道if就是用来判断某一条件是否成立的,但是你知道if语句底层CPU是怎样执行的吗?编译器会把if表达式翻译成怎样的汇编代码吗?补充一个问题:刚入编程这行业的新手容易犯的一个错误,就是在写if语句的时候容易把=(赋值表达式)和==(恒等于)混淆,恒等于的意思是需要表达式成立原创 2017-07-20 22:15:40 · 3891 阅读 · 3 评论 -
全面详解c语言使用cJSON解析JSON字符
为什么选择cJSON来解析JSON字符串?因为简洁又简单,而且效率又快,cJSON工程文件也非常简单,仅一个.c文件和一个.h文件!如果要自己写的话就是重造轮子了,况且效率上也不一定会比cJSON更好!且文件体积大小不到30k,源代码思路也非常清晰,也非常适合研究。点我下载cJSON当我们下载好cJSON只需要把.c和.h文件包含文件拷贝到我们工程目录下,并将头文件和实现文件...原创 2018-01-26 16:41:09 · 76484 阅读 · 36 评论 -
C/C++开发_C语言里类似C++的构造与析构
C++是面向对象的一个编程,当对象作用域结束内存被回收时会调用析构,当创造内存空间时会调用构造,便于我们初始化与释放。当然C语言这个面向过程的编程语言也有初始化与释放在编译器里只需要使用__attribute__来修饰我们的函数属性就可以了,将函数属性设置为constructor,代表初始化,修饰为destructor则为释放。这里需要注意,每个编程语言的思想不同,c语言是面向过程的,也就是说只有你的函数声明为constructor,只会被你的程序调用一次,不能像C++那样灵活在程序运行期间创建原创 2020-11-29 12:26:43 · 318 阅读 · 0 评论 -
按位运算操作符底层实现原理
本篇文章给大家讲解编程软件中的运算符底层实现原理! 1.按位与运算&按位与运算的底层运算过程如下 十进制: 3&5=1 二进制 3: 0011 & 5: 0101 = 1: 0001 按位与运算就是将3的二进制上的每个bit位与5的二进制上的每个bit位比较如果两个bit位上的数相同则保留否则为0! 2原创 2017-07-29 19:42:01 · 2764 阅读 · 0 评论 -
Linux下的GCC和Windows下Visual Studio的编译所生成的文件作用
首先先说一下Linux吧因为这也是博主最早接触的编程开发环境所以比较熟悉的!Linux下就说GCC GCC编译如果不指定编译选项的话是一步到位没有额外的后缀名文件!.i文件:.i文件是GCC -E预处理之后所生成的文件,里面包含着已经完成宏替换,条件编译以及头文件包含等宏指令!.s文件:.s文件是GCC -S把预处理文件(.i)翻译成汇编代码的文件,包括头文件包含函数语法调用全部都会翻原创 2017-08-21 14:41:07 · 3183 阅读 · 0 评论