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

《C缺陷与陷阱》读后感-0     为找工作,前段时间把C语言仔细温习了遍,还草草地看了遍《程序员面试宝典》,加之毕业设计中写了些自以为值得称赞的程序,以为自己对C语言已经有了良好的把握。不过,在刚刚看了两章《C缺陷与陷阱》后,才发现自己的认识是多么的肤浅,才发现C语言的高深莫测,也更加加深了这样的理念:任何事情都有不断深入的必要和要求。同时,为了加深认识,也为练习文字能力,现将主要认识总结如下。    1.C语言是人与 阅读详情

1 语法陷阱

1.1 理解函数声明

  • 任何C变量的声明都由两部分组成:类型及一组类似表达式的声明符(declarator). 这个declarator的求值应该返回这个声明中的类型. 例如

    float *(g());                     /* 这里*(g())的求值结果应该是一个float,即g是一个函数,该函数返回float指针 */
    float (*h)();                     /* 这里(*h)()的求值结果应该是一个float,即h是一个函数指针,该函数的返回类型为float */
    


1.2 运算符的优先级问题

  • 逻辑运算符 < 关系运算符 < 移位运算符 < 算术运算符

1.3 else始终与同一对括号内最近的未匹配if结合

2 语义陷阱

2.1 取值顺序问题

  • C语言中只有四个运算符(&& || ?: ,)有规定的求值顺序,其他运算符的左操作数和右操作数的取值顺序不定.

    y[i] = x[i++];                  /* 可能先执行y[i],也可能先执行x[i++] */
    


  • 函数中不同参数的取值顺序也是未定义的.

2.2 函数的返回值

  • 当未声明函数的返回值时,则C默认函数返回值为int型.

2.3 函数签名

  • 当一个函数被声明或定义之前被调用,则C编译器会自动推测函数的返回值为int,并根据调用的参数列表推测形参列表.

2.4 检查外部类型

  • 当同一个外部变量名在两个不同的文件中被声明为不同的类型时,大多出C语言实现不能检测出这种错误. 这里说的不同类型指的是严格意义上的不同类型,比如数组与指针就是不同类型,虽然它们很接近.

3 库函数

3.1 getchar函数返回值为整数

这是因为char型不能容下所有可能的字符,特别是无法容下EOF

3.2 对文件操作时,一个输入操作不能紧跟着一个输出操作,反之亦然

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{   
    char szContents[10] = "";
    FILE *fp;
    fp = fopen("c:/tmp.txt","r+");
    fread(szContents,3,1,fp);
    printf(szContents);
    strcpy(szContents,"123456789");
    fseek(fp,0L,1);             /* 若没有该行,则无法写入 */
    fwrite(szContents,sizeof(szContents),1,fp);
    fclose(fp);
        system("pause");
 return 0;
}

3.3 使用setbuf函数设置输出的缓冲区时,需要注意在缓冲区释放之前显式调用flush函数将缓冲区清空

#include <stdio.h>
int main()
{
  int c;                        /* 注意这里要用int型 */
  char buf[60];
  setbuf(stdout,buf);
  while((c=getchar()) != EOF)
    putchar(c);
}
/* 上面这段代码出错的原因在于,由于输出内容前要放入buf缓冲,而最后一次flush清空buf的时间是在main函数结束之后,作为程序交回操作系统之前C进行自动清理的时候进行的,而这是,buf已经被释放了! */
/* 更明显的例子是 */
#include <stdio.h>
int main()
{
  int c;                        /* 注意这里要用int型 */
  {
    char buf[60];
    setbuf(stdout,buf);
    while((c=getchar()) != EOF)
      putchar(c);
  }
  flush(stdout);

3.4 使用errno检测错误时,首先要检查函数返回值

在库函数调用成功的情况下,没有强制要求库函数一定要设置errno为0,因此如果直接根据errno来判断,则可能得到的是上一次函数失败调用的errno. 因此,我们应该首先检测函数的返回值,确定失败后,再检查errno来搞清楚出错原因.

3.5 信号的处理函数中不应该包含可能引发Signal的库函数

有些库函数内部会维护一些公共变量,当引发Signal时,这些公共变量可用已经被损坏了,这时候再去调用这些库函数已经是不安全的了.

4 移植性

4.1 short,int,long型的长度是可变的

short,int,long型的长度是可变的,但ANSI规定short,int型整数至少16位,long型整数至少32位

4.2 移位操作时,如果被移位的对象是无符号数则空出的位用0填充,否则可能用0也可能用符号位填充

4.3 移位操作时,若被移位的对象长度为n,则移动计数必须0<=计数<n

4.4 取除法和余数操作时,有些实现保证余数为正,有些实现余数可能为负数

4.5 rand函数的返回值范围根据实现的不同有所不同,ANSI中定义了一个常数RANDMAX等于随机数的最大取值

4.6 realloc函数中的参数一般要求为未释放的内存块地址,但有些实现中可以传入已经释放的内存块,前提是该块内存的内容没有被覆盖.

4.7 当对一个负数n用-n的方式取正时,需要注意可能发生溢出,因为大多数实现中整数的取值范围要小于负数的取值范围!


量化平台深度测评:聚宽 / 米筐 / 迅投 QMT 对比分析 本文对比测评国内主流量化交易平台聚宽、米筐和迅投QMT,从回测性能、实盘稳定性和高级功能三方面展开分析。测试显示:聚宽在低频策略回测中效率最高(128秒),米筐次之;迅投QMT凭借C++直连架构实现最低延迟(150ms)和最高订单撤销成功率(98.5%)。平台特色方面,QMT的智能拆单算法可减少25%滑点损失,聚宽的因子库支持版本控制和缓存复用。建议低频策略选聚宽,高频交易选QMT,团队协作优先考虑聚宽。测试数据均来自合规实盘环境,建议根据策略特性进行试用验证。 阅读详情

相关推荐

Linux内存优化:KSM技术原理与实践指南

内存共享是提升虚拟化环境资源利用率的关键技术,其核心原理是通过识别相同内容的内存页进行合并。Linux内核的KSM(Kernel Samepage Merging)机制采用红黑树数据结构管理内存页,通过多级哈希比较算法实现高效合并。该技术能显著降低物理内存消耗,提升CPU缓存命中率,特别适用于运行大量相似虚拟机实例的场景。在容器化和云计算环境中,KSM与NUMA优化、内存气球等技术协同,可实现40%-60%的内存节省。典型应用包括金融云平台的高密度虚拟机部署,以及Kubernetes集群的基础镜像优化。

weixin_28730353的博客 369

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

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

weixin_34738099的博客 771

RK3588 InsightFace人脸识别移植及精度测试全解析

本文详细介绍了如何在RK3588平台上移植InsightFace人脸识别模型并进行精度验证。通过PyTorch转ONNX、ONNX转RKNN量化模型的关键步骤,实现了INT8量化模型的部署。测试数据显示,该模型在LFW数据集上达到99.43%的准确率(接近官方99.52%),推理时间仅14.23ms。ROC曲线和相似度分布图表明模型区分能力优秀,AUC超过0.99,满足实际应用需求。文中还详解了量化原理、环境搭建和测试方法,为边缘设备部署人脸识别提供了完整解决方案。

Hi20240217的博客 3671

读完《C 陷阱与缺陷》感

读完《C 陷阱与缺陷》感o1书并不厚,一百多页。昨天终于抽出一下午的时间在图书馆把剩下的一半看完,虽只是第一遍,但还是有些感想。02C 强大的灵活性导致了任何一个C 代码都可能隐藏着难以察觉的深层次的错误,而往往越难以发掘的错误所带来的后果往往更加严重,甚至是系统级别的灾难性后果!C语言标准中的各种语法规则简短而简单,但是当它们放到一起,组成一句...

通用代码技术 320

修复后找不到ip 黑群晖_黑群晖引导U盘损坏了怎么办?

前言虽然一般来说引导U盘损坏的可能性很小,但是避免不了万一出现问题导致黑群晖没有办法引导进入系统也是一件相当麻烦的事情。这里我就用两块U盘做个小试验,看看如果黑群晖上的引导U盘损坏以后,另一块U盘需要怎样写引导文件才能让黑群晖正常引导进入系统。试验开始我这里黑群晖使用的是DSM6.1.7的系统,U盘一块使用的是闪迪的酷豆,另一块就是闪迪的酷铄。目前系统引导U盘使用的是酷豆,VID:0781 PID...

weixin_36239323的博客 8269

保姆级教程:用C++逆向解析通达信shm.tnf文件(附完整代码与偏移量详解)

本文提供了一份详细的C++逆向工程教程,指导开发者如何解析通达信的shm.tnf文件。通过分析文件结构、定位关键字段并实现完整解析流程,帮助量化交易开发者高效获取沪市股票数据。教程包含完整代码示例和偏移量详解,适合金融数据本地化处理需求。

weixin_27945229的博客 523

《C陷阱与缺陷》读后感

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

woshiyilitongdouzi的博客 938

【OpenCV3】cv::compare()使用详解

cv::compare()主要用于两个图像之间进行逐像素的比较,并输出比较的结果。具体用法如下: cv::compare() bool cv::compare( cv::InputArray src1, // 输入数组1 cv::InputArray src2, // 输入数组2 cv::OutputArray dst, // 输出数组 int cmpop // 比较操作子,见下表 ...

guduruyu的专栏 9761

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

词法分析的最基本原则是贪心法。和一些晦涩的函数签名的解析。

qq_39377889的博客 1313

CISP-PTE八套真题详解(侵删)_cisp-pte 考题与答案,万字长文轻松彻底入门Flutter

接下来就是代码审计了isset()函数用于检测变量是否已设置并且非 NULL代码中base64解码出来是一个base64的一句话木马根据代码,需要我们提交一个Hello参数,参数的值为多少都行,然后我们可以通过提交z0参数的base64值进行执行命令先用phpinfo();试一下:发现执行成功那么直接写个查看key文件的系统命令(记得最后要加分号)在源代码中找到key。

2401_83947398的博客 4674

基于STM32的双串口同时工作的详细指南(含完整代码示例)

STM32是STMicroelectronics(意法半导体)公司推出的一系列基于ARM Cortex-M内核的微控制器,广泛应用于嵌入式系统中。STM32系列微控制器具有高性能、低功耗和丰富的外设接口,适用于各种应用场景。USART(Universal Synchronous/Asynchronous Receiver/Transmitter)和UART(Universal Asynchronous Receiver/Transmitter)是串口通信的两种方式。

m0_57781768的博客 3805

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

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

嵌入式小师兄的博客 4267

EMB电子机械制动器夹紧力预估策略分析

本文探讨了电子机械制动器(EMB)夹紧力的四种预估方法:1)基于电机电流的方法简单经济但易受干扰;2)基于位置传感器的方法实时性好但依赖模型精度;3)直接力测量精度最高但成本较高;同时提出未来将结合AI和数字孪生技术提升预估精度。研究显示,准确的夹紧力预估对制动安全性、能效和舒适性至关重要,当前面临温度稳定性、参数漂移等技术挑战。随着智能算法的发展,EMB夹紧力预估将实现更高精度和可靠性。

m0_59012156的博客 851

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

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

京东放养的爬虫 1470

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C陷阱与缺陷读书笔记

《C》

doodlesomething 758

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

m0_68190153的博客 689

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

《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陷阱与缺陷》读书笔记与总结

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

DayDayUp 1万+
上一篇: F5讲座简单笔记
下一篇: 如何分析复杂的C语言声明
darksun9972
博客等级 码龄19年 42粉丝 399原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值