C陷阱与缺陷读书笔记

《C陷阱与缺陷》读书笔记 **第一章:词法‘陷阱’**    1.1  =为赋值操作,==是比较,容易将=与==弄混而出现错误。    1.2  &和|为位运算符,&&和||为逻辑运算符。    1.3  贪心法:如果(编译器的)输入流截止至某个字符之前都已经被分解为一个个符号,那么下一个符号将包括从该字符之后可能组成一个符号的最长字符串。    y=x/*p 实际等于 y=x      因为/*将... 阅读详情


                    《C陷阱与缺陷》这本书我想很多人都看过,上周末花了两天时间断断续续的把神作看完。看这本书的心情往往是这样“靠,这个我之前就弄错过,原来是这样”,"这个简单,不就是那什么嘛",“妈的原来这样写会导致这样啊,下次看来我得注意点”。虽然书中介绍的大部分出错点都见识过,并且在多次的折磨后,现在很多已经是烂熟于心,但还是觉得这本书写的相当不错。但是并不推荐代码经验极少的人来看这本书,否则你会有点现在一堆错误里的感觉,得等你有了一定的代码经验后再来看这本书,就会有不同的感受。

             书中提到的错误基本都是经典的,像那些等于和赋值的就不写了,这里就记录一些我觉得比较有意思的吧。

             1.词法分析中的“贪心法”。这个我想稍微看过编译原理的理解起来就是秒杀了(要不说自己尝试写过编译器的debug能力会狂飙呢)。举例说明,当c编译器读入一个字符'/',后跟一个'*',那么编译器是怎么判断的?是把它当成两个字符还是当成一个,其实有一个简单基本原则:每个符号应该包含尽可能多的字符。编译器将程序分解成符号的方法是,从左到右一个个字符读入,如果该字符可能组成一个字符,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是是一个符号的组成部分,如果可能,继续读入下一个字符,重复上述判断,知道读入的字符组成的字符串不再可能组成一饿有意义的符号。如y = x /* p

到底是什么?a---b又什么?其实我心里想,谁让我看到这样的代码我就拿起他的键盘敲死他。

            2.运算符优先级问题。其实这个问题,有点不想加进来我基本不会装逼不加括号,加上括号虽然有人觉得可能有点但往往增加了可读性,而且也没必要记那么清楚用多了就记住了。书中提到有两点需要记住:1.任何一个逻辑运算符的优先级低于任何一个关系运算符(如 x > y && a > b)。2.移位运算符的优先级比算术运算符要底,但是比关系运算符要高。

             3.数组和指针。 这个必须要写,简直就是不少人头疼的问题,这里建议先看看《c专家编程》中第四章和第九章的部分。《c陷阱和缺陷》中基于下面这两个原则来分析:1.c语言中只有一维数组,且数组的大小必须要在编译期间作为一个常熟确定下来。数组中的元素可以为任何类型的对象。2.对于一个数组,我们只能做两件事:确定该数组的大小,以及获得指向该数组下标为0的元素的指针。理解了这两点就可以解决了。

              第一点使二维数组的问题得以解决,第二点可以联想到数组作为函数参数传参,其原则是:c语言为自动将参数的数组省委转换为相应的指针声明。

            4.不对称边界。即x < n 和 x <= n - 1的选择,这我想都懂,但是这是一个好的编程习惯。

            5.字符的char型和int型。这个问题之前在看K&R的《c语言程序设计》中有提到,看到一篇文章介绍的不错(链接)。总之你把它声明为int就好

             当有这么一段程序时:

#include <stdio.h>

int main(void) {
     char c;
     while((c = getchar()) != EOF) {
                putchar(c);
      }
     return 0;
<span style="font-size:18px;">}</span>
由于,声明为了char型,有可能发生截断,则程序就可能发生死循环。如下面的程序和结果是有点出乎意料的:

      

          6.EOF和getchar()。这有点老生长谈,但是还是的注意。下面这是摘抄的说明:

<span style="font-size:18px;">EOF is NOT:

A char

A value that exists at the end of a file

A value that could exist in the middle of a file</span>
          详细的可以看看getchar和EOF总结和getchar是宏
         

       7.让人蛋疼的宏。这我其实也不想写,说实在我及其不想用宏来代替函数虽然可能会有效率上的差距,但是很容易出错。简单记录几点:

             1.不能忽略宏定义中空格。如#define f  (x)  ((x) -1)会出其不意的被解释为#define f (x)((x) - 1).(看看编译原理就会很明白)。

             2.宏的展开可能会得到庞大的表达式,这样反而导致效率的下降。如#define max(a,b) ((a) > (b) ? (a) : (b)),使用max(a,max(b,max(c,d)))时

             3.总之,展开很蛋疼容易出错,简单使用即可。

         8.关于大小写转换。toupper()和tolower()函数,注意是函数,不是宏,虽然它以前可能一度是宏定义的。这里涉及到了前人在效率和程序健壮性的考量和纠结,后来就提供了两个另外的供使用者选择:_toupper() 和 _tolower()这两个是宏定义,在传入参数前要进行判断,即相应的相应的就传入的大写或小写进行转换,否则返回的可能不是预期结果。

        9.其他:1.初始化表中多余的逗号有助于编译器解析,想到了python中如果只有一个元素时必须在后面加逗号。2.指针乱指是允许的,但是如果想取出其中的值就是不允许的,和null有点类似,null指针并不指向任何对象,除非是赋值和比较运算,出于其他目的的操作都是非法。a++不能作为左值即不能出现((a++)++) + b(解释)

           

   疑问:书中程序如下    

<span style="font-size:18px;">#include <stdio.h>


int main(void) {
          int arr[5];
          int i;
          
           for(i = 0; i <= 5; i++)     {
              a[i] = 0;
            }
            for(i = 0; i <= 5; i++) {
                 printf("%d\t",a[i]);
            }
      return 0;
} 
</span>

输出结果:

<span style="font-size:18px;">0 0 0 0 0 0</span>
书中对这样的边界是这样解释的:有些编译器按照内存地址递减的方式给变量分配内存,则数组arr后的一个地址分配给了i则i变为0,程序陷入死循环,这里程序没有陷入思循环, 说明不是这样子,可是为什么却没有越界访问呢?


     总结:天干物燥,小心火烛。这是本书,我只是对其中一些做总结,书中的关于库和链接我想是每一个码代码的已经非常熟悉的,关于可移植性的问题我现在也没有切身的体会,故不写,书的后面还简单介绍了两个头文件,因为以前看过c标准库也觉得没什么。有人说看完这本书后代码会变得更长,我想有些情况是这样的。此书应常备枕边,常翻常新。


             

        

MAX30102心率血样模块在STM32F103芯片的程序说明 我希望你已经安装好了Keil MDK5这个软件,也安装了M3内核,可以编译一些STM32F103的一些项目下载程序后步骤: 1-按照下图找到IIC.uvprojx并打开(途中唯一绿色那个图标) 2-编译一次 3-确保0错误,0警告,下图所示 4-点击目标选项,然后找到STM32F103C8,再点debug–CMSIS****(我实际用的JTAG,用不了,选择这个CMSIS****即可)下图所示 5-下图所示,看看你的串口找到了没,找到了就点左下角的OK 6-按图上传到开发板 7-MAX30102接线方法 阅读详情

相关推荐

SAR动目标检测三剑客:DPCA/ATI/STAP技术选型指南(含2023最新实验数据对比)

本文深入对比了SAR动目标检测三大主流技术DPCA、ATI与STAP的核心原理与性能差异。基于2023年最新实验数据,分析了它们在最小可检测速度、测速精度、计算复杂度及对通道失配敏感度等方面的优劣,并结合海洋监视与城市交通监控等典型场景,提供了具体的技术选型指南与工程落地考量。

m5n6o7的博客 292

c语言缺陷与陷阱,《C语言的缺陷与陷阱》读后总结

我读的这本书是Andrew Koneig 著作的。读完了之后,对我对c语言的理解增加了很多,总结于此,以备我以后或者其他读者学习。第一章:词法陷阱1、编译程序编译C程序的时候使用的是贪心法,也就是说编译程序讲程序分解成符号的方法是,从左到右一个字符一个字符的读入,如果字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串师父可能是一个符号的组成部分,如果可能,继续读入下一个...

weixin_34738099的博客 771

反激电源占空比为何必须小于0.5?次谐波振荡与斜坡补偿详解

在开关电源设计中,峰值电流模式控制因其优异的动态响应和逐周期限流保护而被广泛应用。其工作原理是通过采样电感电流的峰值,与误差电压比较来控制开关管的导通与关断。然而,这种控制方式在反激等隔离拓扑中,当占空比超过50%时,会面临一个固有的稳定性挑战——次谐波振荡。这是由于电流扰动会在相邻开关周期内被放大而非衰减,导致系统在开关频率一半处发生振荡,严重影响输出纹波和可靠性。为解决这一问题,工程上引入了斜坡补偿技术,通过向控制信号叠加一个固定斜率的斜坡,改变环路增益条件,从而在宽输入电压或高占空比需求下维持系统稳定

weixin_29631169的博客 625

《C陷阱和缺陷》读书总结随笔

《C陷阱和缺陷》读书总结随笔简介第一章 词法缺陷1.=不是==2.&和|不是&&和||3.贪心法第二章 句法缺陷1.运算符并不总是具有你所想象的优先级2.switch语句3.函数调用第三章 链接第四章 语义缺陷1.表达式求值顺序2.C 并不总是转换实参待续第五章 库函数1.返回整数的getchar函数第六章 预处理器1.宏不是函数第七章 可移植性缺陷第八章 这里是空闲空间 简介 进行对一些比较经典的书籍进行阅读,练习自己的内功,因为博主比较菜,所以近期会对一些书籍进行全面的总结,欢迎

努力学习的花椰菜的博客 515

第零章 序 Chisel教程汇总

笔者目前西安交通大学微电子硕士在读,研究方向为数字集成电路设计与体系结构。鉴于目前RISC-V的火热程度,笔者参与了课题组的RISC-V项目,并了解、学习了颇受关注的新型硬件构建语言——Chisel,当前参与的神经网络加速器设计便是使用Chisel开发的。这是一门敏捷开发语言,据称要比传统的Verilog语言快很多。在亲身使用过后,笔者发现确实快了不少。这主要得益于Scala作为高级语言的简洁风格...

qq_34291505的博客 7万+

手把手教你学Simulink--基于新能源并网与协调控制的场景实例:双馈异步风力发电机并网运行仿真

随着“双碳”目标的推进,风力发电已成为新能源并网的核心组成部分。其中,双馈异步风力发电机(Doubly-Fed Induction Generator, DFIG)因其变频器容量小(仅处理转差功率)、可实现有功/无功独立调节、运行效率高等优势,广泛应用于现代兆瓦级风电机组。DFIG系统通过转子侧变流器(Rotor-Side Converter, RSC)和网侧变流器(Grid-Side Converter, GSC)实现对发电机转矩与电网无功的精确控制,支持最大功率点跟踪(MPPT)和。

MHD0815的博客 280

《C陷阱与缺陷》读后感

《C陷阱与缺陷》读后感 这本书我在亚马逊上买过一本,放在单位了。后来,想再读,于是在淘宝上又买了一本。 这本书很簿,但很有意思 讲了一些C的内幕,感觉很好玩的。 1.为什么C赋值是有=,而相等是用==呢? 因为赋值语句出现的机率大,所以象哈夫曼编码一样,出现机率大的码就短些,好玩吧。、 2.语句 y =x/*p /* int *p */ 这里p是指向整数的指针,那上面如何理解,是x/(*p)吗?...

woshiyilitongdouzi的博客 938

【反卷积算法】Richardson-Lucy (RL) :通过不断迭代更新图像估计值

Richardson-Lucy(RL)反卷积算法:是一种基于最大似然估计(Maximum Likelihood Estimation, MLE)的图像去卷积方法,常用于去模糊和图像增强。通过不断地更新图像估计值,来最小化模糊图像和恢复图像之间的误差,逐步消除模糊,最终接近真实的原始图像,每次迭代都会根据当前估计的图像来修正下次迭代的结果。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 3036

《C陷阱与缺陷》读书笔记与总结

《C陷阱与缺陷》读书笔记 目录《C陷阱与缺陷》读书笔记一,函数指针和指针函数二,C语言数组三,空指针并非空字符串四,整数溢出五,为main函数提供返回值六,声明和定义(extern)七,命名冲突与 static修饰符八,形参、实参和返回值九, 检查外部变量类型十,预处理器-不能忽视宏定义中的空格十一,预处理器-宏不是函数十二,宏不是类型定义十三,比较时把常量写在左边 ​ 一,函数指针和指针函数 float *g() , (*h)(); ()的优先级大于 * , 因此 *g() 为 *( g() ) ,该函

DayDayUp 1万+

复现论文《基于Retinex理论和深度学习的低照度图像增强算法研究》

本研究提出两种基于Retinex理论和深度学习的低照度图像增强算法。第一种算法在HSV色彩空间中进行处理,采用Res2Block和CBAM-Res2block模块增强多尺度特征表示;第二种算法使用多尺度残差U型网络结构。复现代码展示了Res2Block、CBAM注意力机制等核心模块的实现,包括多尺度特征提取、通道和空间注意力机制。实验结果表明,所提算法能有效解决低照度图像存在的亮度低、对比度不足、颜色失真和细节丢失等问题,显著提升图像质量。

max500600的博客 387

ESD防护设计宝典(十):RE(辐射发射)超标问题排查与解决

RE测试是EMC认证的“头号杀手”。当屏幕上出现一根根超标频谱线时,如何快速定位元凶并有效整改?本讲将带你化身电磁侦探,完成一次完美的RE问题“缉凶”。

m0_56451176的博客 394

C语言进阶:C陷阱与缺陷(读书笔记总)

C陷阱与缺陷读书笔记,C语言进阶

嵌入式小师兄的博客 4267

【Mode】多模干涉仪的设计 Multi-mode interferometer(MMI)

与 Splitter 器件一样,MMI 器件也是一种常见的分光器件,可以根据用户的需求将光束分成不同的比例。本文,我们将介绍如何仿真 MMI 器件。这里我们使用的是 1x2 MMI,其本质上是由四个部分组成的,中间的矩形多模式干涉区域以及左右两侧的三个 taper 模式转换区域。之前的教程中我们也提及了,为了获取稳定的模式场分布,通常,我们需要进行模式收敛性扫描。这里以官网给出的案例为例。如何提取 S 参数我们先暂时不做介绍,后续有时间了我们再做介绍。

u011699626的博客 1212

《c陷阱与缺陷》读书笔记

1. = 不同于 == 2. & 和 | 不同于 && 和 || 3. 编译器将程序分解成符号的方法是,从左到右一个一个读,直到读入的字符组成的字符串已不在可能组成一个有意义的符号,贪心的处理程序。如a --- b编译器就会认为是  a-- - b,而不是认为a - --b。 4. 整数常量,如果一个整型常量第一个字符是0,那么该变量会被认为是8进制数。 5. 单引号引起的一个字符实际上代

京东放养的爬虫 1469

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

《C陷阱与缺陷》读书笔记(一)

这个代码中误将“==”写成了“=”,导致最开始是为c赋值为空字符串,那这行语句恒为真,所以“||”运算符有一个短路现象,它就不会向下执行,也就不会判断c是否等于“\t”和“\n”了。上面代码本意是判断x和y是否相等,如果它们相等,就跳出循环,但是却将“==”误写成了“=”,这样一来if条件判断语句永远为真(赋值语句的结果恒为真),所以就会跳出循环,没有判断x和y相等这一过程。“&”可以翻译为“and”,“|”可以翻译为“or”,所以它们表示的是二进制的按位与和按位或。或者还可以将“==”判断改成“!

m0_68190153的博客 689

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

《C缺陷与陷阱》读书笔记

最近因为工作需要开始重新拾起C语言,虽然说基本语法什么的没有太大问题(不行就网上搜索),但复习巩固下C语言也是不错的。正好身边有《C缺陷与陷阱》这本书,于是就有了这篇读书笔记。

RdouTyping的博客 342

【读书笔记】C陷阱和缺陷

文章目录第一章 词法“陷阱”1.1 = 不同于==1.2 &和| 不同于 &&和||1.3语法分析中的“贪心法”1.4整形常量1.5字符与字符串第二章 语法陷阱2.1 理解函数声明2.2运算符优先级问题2.3注意作为语句结束标志的分号2.4 switch语句2.5 函数调用2.6“悬挂”else引发的问题第三章 语义“陷阱”3.1 指针与数组数组指针数组名与指针引用二维数组二维数组与指针3.2 非数组的指针3.3作为参数的数组声明3.4 避免”举ou法“ 第一章 词法“陷阱” 1.1

weixin_42881419的博客 1066

C陷阱与缺陷 —— 读书笔记-1、词法“陷阱”

《C陷阱与缺陷》是由Andrew Koenig所著,高巍译。Andrew Koenig是AT&T大规模程序研发部(前贝尔实验室)成员,不仅有着多年的C++开发,研究和教学经验,而且还亲身参与了C++的演化和变革,对C++的变化和发展起到重要的影响。 第一章    词法陷阱 编译器中负责将程序分解为一个一个符号的部分,一般称为“语法分析器”。 1.1

Cawen的技术博客 813

C陷阱与缺陷-- 读书笔记一

<br /><br />                     C陷阱与缺陷<br />                                                        读书笔记一<br />1.       词法“陷阱”<br />1.1   =不同于= =<br />C语言中用字符更少“=”来表示频繁发生和使用的赋值操作。而用“= =”表示使用相对较少的比较操作。由于两者相近,可能会因为失误将“= =”误输入为“=”。或反之的误输入。造成程序的不正常,增加程序员工作。

ts_54eagle的专栏 701
上一篇: poj 2586 --水题
下一篇: tmux常用快捷键
doodlesomething
博客等级 码龄13年 53粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值