朝花夕拾 · C语言 | 基础篇

【C编程系列】之朝花夕拾:(1) 基础知识 DATE: 2019-3-8 前言 本系列为重读C/C++ Primer技术书的读书笔记。 阅读详情

       你是否曾与C语言初次相遇,许多概念一知半解。如今带你重走来时路,从头梳理语法、指针、内存、结构体等,陪你扫清底层盲区,为嵌入式开发筑牢根基。
       以此系列博客,记录复盘全过程。

一.计算机体系结构

        在了解C语言前,我们先看看早期计算机的结构:

        不可否认冯诺依曼体系结构为现代计算机的奠基石,它将程序指令像数据一样存储在计算机内存中,让计算机可以自动、连续地执行任务。这使得计算机从专用于特定计算的机器,变成了通用的、可编程的工具。明确了计算机应由运算器、控制器、存储器、输入设备和输出设备五大部件组成。这种清晰的分工奠定了现代计算机硬件的基础框架。

        但随着时代的发展,此类计算机结构已出现明显短板无法继续满足使用要求,最根本的缺陷:指令和数据共享同一条总线(信息通路)与内存交互,导致CPU同一时刻要么取指令、要么取数据,无法同时进行。随着CPU速度远快于内存,这种“抢路”现象拖慢了整个系统的速度。

        现代计算机应运而生,它以存储器为中心,一方面负责与CPU进行数据交互完成作业,一方面向I/O设备输入输出数据,显然,现代计算机CPU集成了运算器与控制器,相比传统更加高效。

二.进制转换

        我们先了解一下进制,所谓不同进制,其实本质即不同基数与位权的组合

1.任意进制转换为十进制

显然,在其他进制转换为十进制的时候最为简单,只需由高到低按照各位的权值进行加法运算即可

2.二进制与八,十六进制转换

        由于2与8,16进制的特殊性,在转换时有着异常的便捷性;对八进制而言,由0-7表示,最大数为7,这与3位二进制所能表示的最大值相同,故我们对二进制可拆分为三位一组。注意,在整数部分一定要由低到高表示,在高位不足三位时需补0;在小数部分则相反,由图上蓝色补足数易见;对于16进制则同理,由0-15表示(从十开始用A-F代替),与四位二进制数所能表示的最大值相同,故采用四位一组,与八进制转换完全同理;思路参考8421编码,也即BCD码。

3.十进制转换位任意进制

        上图所示为短除法的思路,也是多数老师会提及的,但本人并不推荐此方法,因为如果当数据较大时,采用短除法显然较为麻烦,故推荐使用“拼凑法”,如下所示

        这种思路在进行十进制向二进制的转换时较为简单,不过前提是熟知二进制各权重的数值,对数字有一定的敏感性,在初期可能比较茫然,但在经过一定的训练后可以较为快速的拼凑出结果。在得到二进制后,便可采用上述方法得到八与十六进制。

三.基本数据类型及其转换与运算

1.有符号数与无符号数

        显然,当表示无符号数时,整个机器字长全部二进制位表示数值位,没有符号位,所能表示最大数值易知,即全1,最小值为0;当表示有符号数时,最高位用于表示符号位,1负0正,表示范围参考下文。

2.原码与补码

        将原码转换为补码时数值位取反加1(正数原反补不变);也可从右往左数至第一个“1”,1左侧取反(符号位不变),右侧不变。

3.有符号数表示范围

        显然,有符号数原码表示范围关于0对称;计算机底层以补码存储二进制数,而补码相对原码存在特殊性,以八位二进制为例,0000 0000在补码中表示正负零,当符号位为0时,从0000 0001到0111 1111表示1-127,即所能表示最大值为符号位为0,其余全1;当符号位为1时 1000 0000则相比原码可额外表示一个数,则规定为最小负数-128,对short,int,long等同理,即补码的表示范围中,可多表示一位负数,且为最小负数。(反码只是原码转补码中的一个中间状态,并无实际作用;移码通常仅用于整数表示范围,平时学习接触不多,本文不作过多阐述)。

4.int,long,short,char

在64位OS中,int占4字节,long占8字节,short占2字节,char占1字节,表示范围参考上文

	char ch='a';
	printf("int的大小:%d\n",sizeof(int));        //int的大小:4
	printf("long的大小:%ld\n",sizeof(long));     //long的大小:8
	printf("char的大小:%ld\n",sizeof(char));     //char的大小:1
	printf("short的大小:%ld\n",sizeof(short));   //short的大小:2
	printf("ch=%c,%d\n",ch,ch);                  //ch=a,97

man+ascii打开操作人员手册查看ASCII表,显然,char在计算机中存的都是对应表的二进制。

        unsigned short无符号短整型,由于仅有两字节空间,故表示范围较小,容易出现溢出,如下

    unsigned short n=65535;
	unsigned short result=n+1;
	printf("n=%d,n+1=%d",n,result);              //n=65535,n+1=0
 
	unsigned short n1=0;
	unsigned short result1=n1-1;
	printf("n1=%d,n1-1=%d",n1,result1);          //n1=0,n1-1=65535

    注意,若直接输出n+1或n1-1则会得到65536和-1,这是因为系统默认为int,在对short进行运算时会进行

强制转型为int,此时由于int表示范围足够大,故不会存在溢出

5.float与double

    float与double都由三部分构成:数符,阶码与尾数部分;在表示精度和范围方面存在如下差距:

        此外,a为float类型,占四字节,b为double类型,占八字节,对常量小数0.9默认为double类型,故也占八字节;注意到a与b输出均为0.9,这是因为系统默认保留六位小数,而float与double所能表示的精度都大于六位(float6-8位,double12-16位),故输出正确。实则由于0.9在计算机中无法精确表示,存储时必定会出现误差,而底层默认四舍五入,故得到0.9,后面的不准确的尾数被底层截掉只显示六位。

	float a=0.9;
	double b=0.9;
	printf("a=%.20f",a);
	printf("b=%.20f\n",b);
    //a=0.89999997615814208984 b=0.90000000000000002220

          当采用输出20位精度时则可见误差。

	float a=0.9;
	double b=0.9;
	printf("%f\n",a);                                                //0.900000
	printf("%f\n",b);                                                //0.900000
	printf("a=%ld,b=%ld,0.9=%ld\n",sizeof(a),sizeof(b),sizeof(0.9)); //a=4,b=8,0.9=8

同时,float赋值的0.9与double赋值的0.9并不相同,原因也即小数默认为double,在向float存储时出现精度丢失,故二者不相同。

	if(a==b)
	printf("yes\n");
	else
	printf("no\n");
                            //no
	if(a==0.9)
	printf("yes\n");
	else 
	printf("no\n");
                            //no
	if(b==0.9)
	printf("yes\n");
	else 
	printf("no\n");
                            //yes

        最后,float与double在绝大多数现代通用计算机上,之所以是4字节和8字节,是因为它们都遵循 IEEE 754 标准,这个标准明确规定了单精度(float)是32位(4字节),双精度(double)是64位(8字节)。

6.常量与变量

1.常量

顾名思义,即值不可改变的量,一旦定义了,整个程序运行期间都无法改变。

常量分两种:

  1)字面常量,在代码里直接敲的数字或字符,它们本身就是常量可以直接使用。

  整型常量:

    123   //默认十进制signed int
    123u  //unsigned int
    123l  //long
    123ul //unsigned long

    0123  //八进制
    0x123 //十六进制

字符常量:

    'a','b','?','!'等

    数字字符:'0'      对应ASCII表的48

    特殊字符:'\0'     对应ASCII表的0,即NULL

             '\a'     响铃

             '\b'     退格

             '\t'     横向制表符

             '\\'     表示\字符

             '%%'     表示%字符

            ' \" '    表示引号

             '\v'     纵向制表符,同'\f'

             '\r'     回车,光标回到本行开头

    此外,在C语言的转义序列(\)中,只能使用八进制(\ooo)和十六进制(\xhh)来表示ASCII码,且默认使用八进制(如'\100'表示八进制100,对应十进制64,表示@),无法直接用十进制。如果用十进制,可以直接写整数(如 char c = 64;),但这是整数常量,不属于转义字符。
    编译器采用“贪婪匹配”原则,最多读取 3 个八进制数字(0-7),一旦遇到非八进制数字(8或9)或读满3位就立即停止。
     

浮点型常量

    3.14  默认为double类型,增加后缀f转型为float,3.14f(f,F都可)则表示float类型
    
    科学计数法:3.14e2表示314,3.14e-2表示0.0314,亦然(e,E都可)

字符串常量

"Hello world" 共12字符,11可见+末尾'\0'(字符串隐含,作为结束标志)

第二种:标识符(用来表示常量名,变量名,函数名及数组名等)常量,有利于增强代码可读性。

    #define 标识符 值            宏定义方式(标识符尽量大写,用于区分普通变量)

    注意宏定义只做代码替换,不做数据运算,如
     #define A 2+3          
      B=A*A;            

    此时即为B=2+3*2+3=11,而非25.
    故在定义宏时尽量加括号,括号优先级在运算符里最高,此时#define A (2+3)即为5

2.变量

        即程序运行过程中,其值可以发生变化的量。

        变量名的命名要遵循标识符的命名规则:所有标识符都必须以字母或下划线开头,不能以符号或数字开头,除开头外其他位置可由字母、下划线或数字组成;避免与关键字函数名等重复。

    两种命名规则:
    
    驼峰法:                linux内核命名:
    MaxVal                    max_val
    MinVal                    min_val
    TmpNum                    tmp_val

7.类型转换

1.强制类型转换
       1) 有无符号数之间转换

                保持位值不变,仅改变这些位的解释方式

        2)不同整数类型之间转换      
        3)整数类型强转总结

       4) 整数与浮点数之间类型转换

          需要注意的是int与float之间的转换,在int转换为float时存在精度丢失问题,由于int占32b,而float尾数仅23位(即使算上IEEE754标准的一位隐藏位也仅24位),不足以完整表示int型数据;而由float向int转换时,由于float表示范围远大于int,则可能出现溢出以及小数转为整数时的精度丢失。总结,int精度更高,float表示范围更大,故二者之间转换存在隐患。

2.隐式类型转换

        计算机在运算时会默认将低精度数据类型自动转换为高精度数据类型,如float->double; char,short->int->unsigned int ->long;其中float在运算时一定会转换为double,char与short在运算时一定会转换为int。

float x=10/4        //结果为2.0 ,10和4均为整型,整型相除得整型再赋给浮点型
float x=(float)10/4 //结果为2.5,10被转为float,计算结果则为2.5
如果是 x = 10 / 4;,printf("%f", x); 会输出 2.000000。
如果是 x = 10.0 / 4;,printf("%f", x); 会输出 2.500000。

即,判断除法是整数除法还是浮点数除法,只看除号两边的操作数类型,和赋值给谁(int或float)没有任何关系
而对整型数而言,赋给一个小数值会直接截断小数部分,而不会四舍五入

8.整数加减运算

        计算机底层对有符号数与无符号数的加减运算都采用同一套电路,由一个多路选择器MUX和一个加法器组成,以及控制器控制Sub发出信号协调工作。

        对于加法运算,控制器发出信号,将Sub位置0,加数Y从一端进入MUX不做任何操作,与加数X输出到加法器中相加得到结果;对于减法运算,以X-Y为例,Sub此时置为1,控制减数Y从带反向器的一端将Y全部位取反后经过MUX输出到加法器,同时Sub将1输出到加法器作为末位与X和Y取反之后的值相加,得到的结果即为X-Y的值。

        为什么该电路对于减法也可以实现呢?其实底层在运算减法时,会将减数取负,此时减法即变为加法,而Sub的功能即控制减数取反,同时通过Cin端口输入到加法器,在做减法时实现末位加1,实现对减数取负功能。

        而对于电路来说,有符号数与无符号数的工作原理完全相同,可以理解为运算器本身无法识别处理的二进制数据有没有符号,只是在计算完后人为的对最高位权值进行解释,有符号数则解释最高位为符号位,无符号数则解释为数值位。至此,整数加减运算的底层原理一览无余。

四.运算符

1.算数运算符  

         双目运算符:两个操作数

          + - * / % 

         %:操作数必须是整型数据或与整型兼容的(char),且结果与左操作数同号
         单目运算符:一个操作数

            ++   --

2.赋值运算符

               =  +=  -=  *=  /=  %=

        左边只能是变量,右边可以是变量,常量,表达式

        当运算符两边数据类型不一致时,参考第七节类型转换

        赋值运算符优先级只高于逗号运算符

        注意,赋值运算符也有返回值,返回值即赋的值

3.三目运算符

        逻辑表达式?表达式1:表达式2

        若逻辑表达式的结果非零,则三目运算符结果为表达式1的值,否则为表达式2的值.

4.逗号运算符

        表达式1,表达式2,表达式3,......表达式n;其值取最后一个表达式n的值

        优先级最低

5.sizeof表达式

        获取数据类型,变量,常量,表达式在计算机中所占的内存

        返回unsigned long类型

6.关系运算符

        < ,>,<=,>=        高优先级

         ==,!=               低优先级

        关系表达式的值是一个逻辑值,即‘真’或‘假’。C语言规定,0为假,非0为真

7.逻辑运算符

        &&:逻辑与,全真为真,一假为假

        ||:逻辑或,一真为真,全假为假

        !:逻辑非,取反

 8.各运算符优先级

        当优先级相同时看结合方向,其中单目运算符,三目运算符和赋值运算符为自右向左方向,其余均为自左向右方向。

李沐之数值稳定性+模型初始化和激活函数 层记为t,这里的y不是预测,还包括了损失函数,y是优化函数,不是预测的结果y。第t层是输出。所有的h都是一些向量,向量关于向量的导数是一个矩阵,所以用了很多次的矩阵乘法,出问题就在这里。 阅读详情

相关推荐

5种主流触觉传感器对比:GelSight、DIGIT、Taxim、GelSlim和TACTO怎么选?

本文深度对比了GelSight、DIGIT、Taxim、GelSlim和TACTO五种主流触觉传感器的技术原理与应用场景。针对机器人及VR项目的选型需求,文章从光学与电子传感的技术分野出发,分析了各传感器在分辨率、响应速度、集成难度和成本上的核心差异,并提供了从需求出发的实战选型决策框架,帮助开发者找到最适合的触觉解决方案。

weixin_29268637的博客 695

朝花夕拾 · C语言 | 数组篇

数组一般形式:类型说明符 数组名 [常量或常量表达式];类型说明符:基本数据类型、构造数据类型(不能是void类型)。说明数组中保存的数据的数据类型。数组名:遵循标识符的命名规则。常量或常量表达式:数组中可以保存的元素的个数。int a[10];sizeof (a);//40字节//32字节//20字节注意:常量表达式中可以包括常量和符号常量,不能包含变量。也就是说,C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是不行的。

Vvc_Python的博客 719

沈阳计算机研究所复试,沈阳计算所复试试题附答案.doc

沈阳计算所复试试题附答案目录数据结构1200612007220085200914操作系统16200616200718200818200919组成原理20200620200720200821200921经典算法22数据结构2006数据结构部分(共25分,第1题10分,第2题15分)在(下图)所示的有向图中:v1 v2v4 ...

weixin_42511053的博客 862

朝花夕拾 · C语言 | 多文件篇

4.在对应的头文件中加extern关键字声明,头文件中全局变量只能声明不能初始化,定义应在.c文件。Makefile:管理代码工程的编译和链接,由make工具进行解释,实现一键化工程的编译和链接。依赖文件(生成目标文件所依赖的源文件):main.c sum.c sub.c ......编译规则:gcc main.c sub.c sum.c ( -o a.out)在头文件的声明里,函数默认为extern,编译器会自动加上。2.如果只是在定义该全局变量的文件中使用该全局变量,可以不声明;

Vvc_Python的博客 394

实用电路精讲系列---仪表放大器

摘要 仪表放大器通过三级运放架构实现高共模抑制比(CMRR>100dB)和精密差分放大,其核心是第一级同相运放提供高输入阻抗和可调增益(G=1+2R/RG),第二级差分运放消除共模干扰。具有低失调(≤50μV)、低温漂(≤0.6μV/℃)特性,广泛应用于智能断路器电流监测、ECG心电信号放大等场景。典型电路采用LTC1049运放,通过匹配电阻网络实现199倍差分增益,结合输出缓冲确保信号稳定性。设计时需注意输入共模电压范围限制和增益电阻精度,优选集成IC(如AD620、INA128)以规避分立元件匹配

weixin_40590799的博客 2073

使用DevExpress22.X(Patch)控件库在VisualStudio2022使用C#进行Winform、WPF应用的开发,看这一篇就够了!

写在开头,Dev Express是个十分强大的控件库(下文简称Dev),但碍于其高昂的使用费用,“出于学习目的”,我们一般使用的都是Patch版本(在版权意识日趋加强的当下,不要提那两个字,现在加上那些字,百度都搜不出内容)。

平凡之路 2万+

朝花夕拾 · C语言 | 指针篇

基类型 *变量名;基类型:该指针指向的空间存储的数据的数据类型:int、char、float 、double 、void、构造数据类型* : 类型说明符,说明后面的变量是一个指针变量名:遵循标识符的命名规则p开头指针变量中保存的地址,是该数据类型的首地址。

Vvc_Python的博客 409

PHP实现获取本机ip及mac地址​(附完整源码)

PHP实现获取本机ip及mac地址​(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 354

朝花夕拾 · C语言 | 结构体篇

int num;结构体类型 变量名;int mon;int day;}mydate;

Vvc_Python的博客 357

Windows 11 安装 JDK 21:下载、安装、配置环境变量、验证

本文详细介绍了在 Windows 11 系统中安装 JDK 21 的完整流程,包括从 Oracle 官网下载压缩包、解压至自定义目录、配置 JAVA_HOME 与 Path 环境变量,并验证安装是否成功。文章推荐使用 ZIP 压缩包而非安装程序,以实现绿色便携、多版本共存等优势,并通过一个包含 Java 21 新特性的示例程序进行功能验证,适合开发者快速上手。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2519

YOLOv8与Swin Transformer的完美结合:如何提升目标检测的精度与速度

Swin Transformer(Shifted Window Transformer)是一种新型的视觉Transformer架构,采用了局部窗口(Window)和局部窗口偏移(Shifted Window)的策略,极大减少了计算复杂度,同时保持了全局感知能力。局部窗口注意力:每个窗口内的元素进行自注意力计算,减少计算量。窗口偏移:通过在不同层次引入窗口偏移,增强了全局信息的交互。层级设计:通过堆叠多个层次的模块,逐渐捕捉不同尺度的特征。

shrgegrb的博客 2151

朝花夕拾 · C语言 | 内存篇

内存管理

Vvc_Python的博客 466

【论文精读】《Towards Deep Learning Models Resistant to Adversarial Attacks》

本文探讨了深度学习模型在面对对抗性攻击时的脆弱性,并提出了一种基于鲁棒优化的方法来增强神经网络的对抗鲁棒性。通过鞍点优化框架,作者提供了对抗攻击和防御机制的统一视角,并在MNIST和CIFAR-10数据集上验证了其方法的有效性。对抗训练的核心思想是将对抗样本引入训练过程,使模型能够学习到对抗样本的特征,从而提升其鲁棒性。本文通过鞍点优化框架提出了一种基于鲁棒优化的对抗训练方法,显著提升了深度学习模型的对抗鲁棒性。本文为深度学习模型的对抗鲁棒性研究提供了新的理论和实证支持,同时为未来研究指明了方向。

nmdbbzcl的博客 611

朝花夕拾 · C语言 | 预处理命令篇

预处理:展开和#相关的代码:展开头文件、展开宏、处理预处理命令编译:将c语言程序转换成汇编指令。汇编:将汇编指令转换成二进制可执行程序链接:负责链接系统的函数/库函数的实现(链接函数)

Vvc_Python的博客 386

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

朝花夕拾 · C语言 | 函数篇

此外 ,%f 不能接收double型,且双引号里写了什么,在输入时也要相同,所以除了格式控制符之外尽可能少写其他数据。八进制与十六进制也可指定输出域宽,如%8o表示输出八位八进制数,%8x表示输出八位十六进制数;此外,%lo与%lx则可表示以八和十六进制输出long型。在输入整型时,可以使用空格,Tab与Enter隔开两数,除此之外用其他字符则会直接中断输入,舍弃后续读入的数字。域宽输出: 7. %nd 以n位域宽输出,若数据大于n位则以实际位数输出,否则左侧补空。

Vvc_Python的博客 349

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

[C语言朝花夕拾] C语言中的命令行输入参数判断

在C语言中,我们的函数入口经常会有: int main(int argc, char** argv) { ... return 0; } 类似这样的传入参数,这类型的参数是为了,用户在利用命令行调用该程序的时候,能够传入适合的参数去控制程序的特定行为。例如,假如现有程序: #include <stdio.h> int main(int argc, char** argv) { printf("number of arg %d\r\n", argc); int i = 0; for

机器学习杂货铺1号店 1879

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

朝花夕拾 · C语言 | 流程控制篇

if,switch,for,while,do while

Vvc_Python的博客 351

朝花夕拾C

偶然见看到这个问题:structure alignment 这些C的问题都是相当基础而且经典的。 然而我在编译的途中,犯了个更加经典的错误,囧~决定重新拾起大一没学好的C,也好好记录下来。 直接拷贝的源代码,就加了一main函数,打印三个struct的size struct X { short s; /* 2 bytes */ /* 2 padding

Make history... 470

朝花夕拾 · C语言 | 位运算篇

<按位左移 按位左移,低位补0 num << n <===> num *2^n。>>按位右移 按位右移动,有符号数高位补符号位:无符号数高位补0。| 按位或 有1则1,全0为0。~按位取反 1取反为0,0取反为1。1010 0010 //低四位置0。& 按位与 全1为1,有0则0。^ 按位异或 相同为0,相异为1。3.两数交换(不使用中间变量)

Vvc_Python的博客 299

朝花夕拾 · C语言 | 调试篇

l 列出原代码。q 退出gdb。r 运行程序。S 跟进函数。1.编译程序:-g选项:允许使用gdb进行调试。gnu提供的Linux下的代码调试工具。b+行号 在指定行打断点。p+变量名 查看变量值。where 定位段错误的位置。1.使用gdb调试逻辑错误;2.使用gdb调试段错误。gdb./可执行程序。

Vvc_Python的博客 164

[朝花夕拾C语言]:指针的进阶学习

指针到底是个啥呢?在指针里面(1.数组 2.数组指针 3.指针数组 4.函数指针 5.函数指针数组) 的基本概念和应用,如何区分!

qq_44838021的博客 223

朝花夕拾C语言:输出字母对应的金字塔

输出字母对应的金字塔

qq_44838021的博客 479

C语言 0 写在前面

本节内容如下:写在前面1——已有已行写在前面2——C语言 写在前面1——已有已行 学计算机已经好几年了,很多初学时觉得很难的问题在如今已经变得不再那么难以理解了。学了这几年,知识很零碎,很杂。年前的寒假就想要梳理一下学过的知识了,当时写了一些java有关的文章,写的时候总感觉哪里不对,后来才知道是顺序出现了问题。计算机知识其实也是有很强的连贯性的,不从头开始,有些地方就会变得很啰嗦。单从编程方面来...

ZERO.ONE的博客 443

【朝花夕拾C语言】:C语言,猜猜谁是凶手?

详细说明了:四个人当中的凶手该如何进行判断和五个人每个人都只说了一般真话的代码实现!打开新的思路和想法.......

qq_44838021的博客 888

【朝花夕拾】C语言-空白与注释

从严格意义上来说,C语言并没有如Python那样严格的缩进限制,所以你可以很自由的编写你的代码。但是,那样会导致你的代码可读性非常差,当你的程序出现了BUG,想要调试的时候,你会发现自己都不知道自己写的是什么了。因此一个良好的编码习惯显得尤为重要,不为了别人,就为了我们自己能够很好的DEBUG,我们也应该养成一个良好的编码习惯。 一、合理的使用注释 注释分为行注释和块注释,所有的注释都会被预处

心若微尘的博客 1183

朝花夕拾C语言:去掉程序中的空格然后输出

将题目中的空格进行去除,然后对所得到的数组进行输出:

qq_44838021的博客 716
上一篇: 基于 Ubuntu 的 linux操作系统基础入门
下一篇: 朝花夕拾 · C语言 | 函数篇
剑指offer.
博客等级 码龄3年 15粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值