C陷阱与缺陷——第2章语法陷阱

1. 理解函数声明

硬件将调用首地址为0位置的子例程

(*(void(*)())0)();

任何C变量的声明都由两部分组成:类型以及一组类似表达式的声明符,声明符从表面看与表达式有些类似,对它求值应该返回一个声明中给定类型的结果。

假定变量fp是一个函数指针,那么如何调用fp所指向的函数的调用方法如下:

(*fp)();

ANSI C标准允许程序员将上式简写为fp(),但是一定要记住这种写法只是一种简写形式。

我们一旦知道如何声明一个变量,也就自然知道如何对一个常数进行类型转换,将其转型为该变量的类型:知需要在变量声明中将变量名去掉即可。

硬件将调用首地址为0位置的子例程可读性更好的写法如下:

typedef void (*funcptr)();
(*(funcptr)0)();

signal函数接受两个参数:

  • 一个整型的信号编号
  • 一个指向用户定义的信号处理函数的指针

声明signal函数:

void (*signal(int, void(*)(int)))(int);

也可以使用typedef简化上面的函数声明:

typedef void (*HANDLER)(int);
HANDLER signal(int, HANDLER);

2. 运算符的优先级问题

优先级最高的并不是真正意义上的运算符,包括数组下标、函数调用操作符、结构成员选择操作符,括号,自左向右结合。

单目运算符优先级仅次于前述运算符,自右向左结合。

单目运算符中,算术运算符最高,移位运算符次之,关系运算符再次之,接着是逻辑运算符,赋值运算符,最后是条件运算符(实际上是三目运算符)

  • 任何一个逻辑运算符的优先级低于任何一个关系运算符
  • 移位运算符的优先级比算法运算符要低,但是比关系运算符要高

运算符==和!=的优先级要低于其他关系运算符的优先级

所有的赋值运算符优先级是一样的,而且它们的结合方式是右到左

在所有的运算符中,逗号的优先级最低

3. 注意作为语句结束标志的分号

4. switch语句

switch的case后需要加上break才会退出switch,不然会继续往下执行其他case,这个特性既是优势,也是一个弱点,但不使用break时,最好加上注释

5. 函数调用

C语言要求:在函数调用时即使函数不带参数,也应该包括函数列表。

6. 悬挂else引发的问题

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

通过宏定义也可以悬挂else问题:

#define IF      {if(
#define THEN    ){
#define ELSE    }else{
#define FI      }}

使用过程如下:

IF x == 0
THEN IF y == 0THEN error();FI
ELSE z = x + y;
f(&z);
IF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/197395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘预付费电表怎么无线收费——方便快捷收费

【摘要】针对目前市场上普遍以Ic卡作为售电介质的预付费售电系统存在的问题,介绍了一种新型的无线预付费售电系统及其构成,并给出了整个系统设计的完整方案。整个系统包括用户终端和电力管理系统端,它们之间通过双工通信可以将用户用电信息和…

Kubernetes存储搭建NFS挂载失败处理

搞NFS存储时候发现如下问题: Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 5m1s default-scheduler Successful…

电子学会全国青少年软件编程等级考试 中小学生python一级历年真题解析【更新至2023年9月 持续更新】

中国电子学会python等级考试一级历年真题解析 一、考级知识点分析 一、 了解Python多种开发环境,熟练使用Python自带的IDLE开 发环境,能够进行程序编写、调试和分析,具备使用Python开发 环境进行程序设计的能力 了解Python常见的几种编程环…

堆排序详细解读

简介 堆排序是一种基于二叉堆数据结构的排序算法,它的特点是不同于传统的比较排序算法,它是通过建立一个堆结构来实现的。堆排序分为两个阶段,首先建立堆,然后逐步将堆顶元素与堆的最后一个元素交换并调整堆,使得最大…

EM32DX-C2【C#】

1说明: 分布式io,CAN总线,C#上位机二次开发(usb转CAN模块) 2DI: 公共端是: 0V【GND】 X0~X15:自带24v 寄存器地址:0x6100-01 6100H DI输入寄存器 16-bit &#x…

ROS2 galactic生成的bag包里的MarkerArray在humble下播放不正常

近期发现ROS2 galactic下生成的bag包在humble下回放时使用rviz可视化,bag里的点云可以正常看到,但是使用Marker和MarkerArray画的box却死活看不到,感觉很纳闷,看网上有人报告说foxy下生成的bag包在galactic下播放会报SQL错误&…

Redis部署-哨兵模式

目录 redis sentinel相关名词 redis sentinel架构 故障转移流程 基于docker搭建redis哨兵 准备工作 搭建过程 模拟主节点宕机,观察哨兵节点的工作流程 哨兵重新选取主节点的流程 1.主观下线 2.客观下线 3.哨兵节点推举出一个leader节点 4.leader选举完毕,leader挑选…

RflySim | 姿态控制器设计实验一

姿态控制器设计实验1 一. 姿态控制设计简介 本文是建立在多旋翼的姿态即控制器中的反馈信号能够被较好地估计的前提下,控制器中的反馈信号是估计值。不过,为了更加简便根据分离原理,我们用真值代替反馈信号。本文的目的是让多旋翼的姿态能够…

Linux入门攻坚——7、磁盘管理——文件系统挂载管理及RAID、LVM

已经安装文件系统的分区需要经过挂载才能使用。 一切文件系统的使用都是从根开始,根是文件系统的起始点。 计算机启动过程:加电自检——bootloader——kernel——rootfs——/sbin/init kernel第一步要加载根系统。 将额外文件系统与根文件系统某现存的…

用swig封装c++代码给python使用

前面我们用swig封装了c的代码给java使用: 如何用SWIG封装c接口给java使用?-CSDN博客 但是由于我们的代码写的太好了,python用户也想用,我们需要将c代码封装一下给python用户使用。 这种需求很常见吧。 现在AI动不动就是用pytho…

Python如何从文件中读取数据

从文件中读取数据 1. 读取整个文件 要读取文件,首先来创建一个文件: 然后打开并读取这个文件,再将其内容显示到屏幕上: file_reader.py with open(pi_digits.txt) as file_object:contents file_object.read()print(contents)…

代码随想录第二十一天(一刷C语言)|回溯算法组合

创作目的:为了方便自己后续复习重点,以及养成写博客的习惯。 一、回溯算法 1、种类 排列、组合、分割、子集、棋盘问题 2、回溯步骤 (0)回溯抽象 回溯法解决的问题均可以抽象为树形结构(N叉树) &…

Redis 分布式锁测试

一、前提依赖&#xff08;除去SpringBoot项目基本依赖外&#xff09;&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId> </dependency><!-- 配置使用redis启动…

【React设计】React企业级设计模式

Image Source : https://bugfender.com React是一个强大的JavaScript库&#xff0c;用于构建用户界面。其基于组件的体系结构和构建可重用组件的能力使其成为许多企业级应用程序的首选。然而&#xff0c;随着应用程序的规模和复杂性的增长&#xff0c;维护和扩展变得更加困难。…

计算机辅助药物设计AIDD-小分子-蛋白质|分子生成|蛋白质配体相互作用预测

文章目录 计算机辅助药物设计AIDD【小分子专题】AIDD概述及药物综合数据库学习机器学习辅助药物设计图神经网络辅助药物设计自然语言处理辅助药物设计药物设计与分子生成 计算机辅助药物设计【蛋白质专题】蛋白质数据结构激酶-Kinase相似性学习基于序列的蛋白质属性预测基于结构…

SSM项目实战-前端-添加分页控件-调正页面布局

1、Index.vue <template><div class"common-layout"><el-container><el-header><el-row><el-col :span"24"><el-button type"primary" plain click"toAdd">新增</el-button></el-…

JavaScript新特性

JavaScript新特性 紧接上文&#xff0c;JS入门手册&#x1f4af; 这篇文章介绍了&#xff0c;JavaScript的基本语法&#xff0c;而随着时代发展&#xff0c;JS早已今非昔比&#xff0c;推荐一个大佬的文章&#xff1a;阮一峰老师 ECMAScript ECMAScript&#xff08;简称“E…

锂电池包膜机通过设备管理系统做好预测性维护的作用

在现代工业生产中&#xff0c;包膜机在锂电产业链中处于电池制造环节&#xff0c;是锂电池生产线上的关键设备之一。然而&#xff0c;随着生产规模的扩大和工作环境的复杂化&#xff0c;锂电池包膜机也面临着常见故障和维护需求。为了更好地管理和维护锂电池包膜机&#xff0c;…

新加坡社区领袖卓顺发的荣誉与大爱精神

2023年11月24日,善济医社义务执行主席卓顺发太平绅士JP, BBM(L), PVPA受邀出席内政部主办的答谢活动2023,主宾为内政部长兼律政部长尚穆根先生(Mr. K Shanmugam)。 2018年起,卓顺发受委为太平绅士后,应内政部邀请,担任纪律咨询委员会委员和巡狱太平绅士及视察团委员。他在颁奖…

Java并发模式和设计策略

引言 小伙伴们&#xff0c;今天小黑要和咱们聊聊Java并发编程的那些事儿。在现代软件开发中&#xff0c;高效地处理多任务是一个不可或缺的能力。特别是对于服务成千上万用户的应用&#xff0c;能够同时处理多个操作不仅是一个加分项&#xff0c;简直是必备技能了&#xff01;…