【C陷阱与缺陷】两道“有趣”的代码题

这篇具有很好参考价值的文章主要介绍了【C陷阱与缺陷】两道“有趣”的代码题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C陷阱与缺陷】两道“有趣”的代码题

【C陷阱与缺陷】两道“有趣”的代码题

如果读者不了解函数指针的,可以先看看这篇文章 链接

< 第一题 >

代码:

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

解析:

💬如果你是头一次看上面这段代码的话,心里一定是一个大大的问号???现在我就来解释一下

  • 本题的突破口在于这个0,仔细观察可以发现,0前面有一个括号(),括号里面的这种形式若是你自己去看的话就是一个函数指针,那相当于就是对0进行一个强制类型转换,把它变成一个函数地址,然后前面的*我们刚才讲过,就是对这个函数进行解引用,获取到这个函数。那么最后一步便是去调用这个函数

具体的分解可以看看下图👇

【C陷阱与缺陷】两道“有趣”的代码题
分步细说:

  1. void (*)() —— 》一个没有形参,返回类型为void的函数指针

  1. (void (*)())0 ——》 对0进行强制类型转换,使其被解释成为一个函数的地址

  1. *(void (*)())0 ——》对0地址处的函数进行解引用,获取到这个函数

  1. (*(void (*)())0)() ——》调用0地址处的函数

原文现身:
【C陷阱与缺陷】两道“有趣”的代码题

< 第二题 >

代码:

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

解析:

💬同理,若是第一次见一定会被它绕晕了😵了

  • 本题真的可以说是在套娃了,首先你看到的一定是signal,它呢是C语言中的一个信号函数,有兴趣可以去了解一下,我们知道()的优先级高于*,所以signal会和后面的内容先结合,那其实已经可以看出这是一个函数声明了。进到里面再来看看这个函数有两个参数,一个是int,一个是函数指针,那么外层的又是什么呢?
  • 仔细看下图,我将内部的signal()函数声明抽离了出来,只剩下了头和尾,你可以做一个视觉上的合并,那其实又是一个void (*)(int)的函数指针,其实这就是signal函数的返回类型,是一个函数指针

【C陷阱与缺陷】两道“有趣”的代码题

同样地,我们再来捋一遍

分步细说:

  1. void (*)(int) —— 》是一个函数指针,为signal函数的形参

  1. signal(int, void(*)(int)) ——》 是一个函数声明,signal与右侧的()率先结合,内部有两个形参

  1. void (*)(int) ——》也是一个函数指针,不过是作为signal函数返回类型

优化:

对于上面的这种写法你是否觉得很冗余,其实可以再度进行一个优化,那么你可能很快就看得懂了

  • 因为 void (*)(int) 是出现了两次,之前我们在C语言中有学习过typedef这个关键字,可以用来对一个很长的数据类型或者变量进行重命名,那么在这里我们也可以这样做
  • 不过呢,你要把重命名后的名字放在(*)里面,因为语法这么规定了,去掉变量名后就是它的类型
typedef void(*ptr_t)(int);
  • 于是这句代码就可以简化为下面这种形式👇注意解引用那个*不要了,函数指针这里是可以省略的
//void (*signal(int, void(*)(int)))(int);
ptr_t signal(int, ptr_t);

原文现身:

【C陷阱与缺陷】两道“有趣”的代码题


两道题讲完了,你是否有收获呢?有兴趣的话可以私信我,发你《C陷阱与缺陷》的电子书.pdf

—— 2023.4.18记

【C陷阱与缺陷】两道“有趣”的代码题文章来源地址https://www.toymoban.com/news/detail-422356.html

到了这里,关于【C陷阱与缺陷】两道“有趣”的代码题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端代码常见的安全缺陷(一)

    目录 1、使用不安全的target blank 问题描述: 修复建议: 2、Javascript 代码劫持 问题描述: 修复建议: 示例: 3、跨站请求伪造 问题描述: 修复建议: 4、遗留的调试代码 问题描述: 修复建议: 5、HTML页面中包含硬编码域名 问题描述: 修复建议: 6、密码管理:null 密码 问

    2024年04月25日
    浏览(29)
  • 简单好玩的python编程代码,python有趣简单的代码

    这篇文章主要介绍了一个简单又好玩的python代码手机版,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。 本篇文章给大家谈谈python200行有趣小程序,以及python简单小游戏代码,希望对各位有所帮助,不要

    2024年02月03日
    浏览(81)
  • 简单的python代码编程图形,python有趣的图案代码

    大家好,小编为大家解答简单的python代码编程图形的问题。很多人还不知道python代码画图案简单,现在让我们一起来看看吧! python是一种强大的编程语言,通过使用python,我们可以进行各种各样的图案、语句、动画等等编程。你知道用python画五角星的代码是什么吗?今天小编

    2024年02月05日
    浏览(41)
  • 如何用代码来实现电脑中“病毒”----关机小程序。 代码的有趣应用~

    shutdown -s -t 60              -s 是设置关机 -t 是设置时间关机 60 是60s后关机 shutdown -a 取消关机 可以win + r ,输入cmd,进去输入上面的,也可以 #define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h      //来引入打印函数printf #include stdlib.h   //声明 生成随机数字的函数 rand/ system执行系统命

    2024年02月10日
    浏览(44)
  • 【Python炫酷系列】这个3D星空好有趣(完整代码)

    python3.11.4及以上版本 PyCharm Community Edition 2023.2.5 pyinstaller6.2.0 ( 可选 ,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~) 【注】 python环境搭建请见:https://want595.blog.csdn.net/article/details/134586653 pyinstaller使用教程见:h

    2024年02月03日
    浏览(47)
  • 使用OpenCV和Python实现缺陷检测的示例代码

    你需要使用cv2.imshow()函数来显示结果。具体来说,你可以使用以下代码来显示结果: 在上面的代码中,\\\'Result’是窗口的名称,img是要显示的图像。cv2.waitKey(0)函数会等待用户按下任意键后关闭窗口。cv2.destroyAllWindows()函数会关闭所有打开的窗口。

    2024年02月12日
    浏览(66)
  • python简单易懂的小程序,python有趣小程序代码

    大家好,小编来为大家解答以下问题,python简单易懂的小程序,python有趣小程序代码,今天让我们一起来看看吧! Source code download: 本文相关源码 本篇文章给大家谈谈python200行有趣小程序,以及python简单小游戏代码,希望对各位有所帮助,不要忘了收藏本站喔。 经常听到有朋

    2024年03月20日
    浏览(48)
  • python200行有趣小程序,python简单小游戏代码

    本篇文章给大家谈谈python200行有趣小程序,以及python简单小游戏代码,希望对各位有所帮助,不要忘了收藏本站喔。 经常听到有朋友说,学习编程是一件非常枯燥无味的事情。其实,大家有没有认真想过,可能是我们的学习方法不对? 比方说,你有没有想过,可以通过打游

    2024年02月04日
    浏览(64)
  • chatgpt赋能python:10个好玩的Python代码-让编程更有趣!

    作为一名有10年Python编程经验的工程师,我深刻理解到编程可以是一件令人兴奋和有趣的事情。Python是流行且多才多艺的编程语言,具有简洁易懂的语法和丰富的库,可以帮助开发人员快速轻松地实现创意想法。在本文中,我将分享10个好玩的Python代码,让你的编程体验更加有

    2024年02月15日
    浏览(48)
  • python200行有趣小程序,python简单小游戏代码_python小程序200例

    本篇文章给大家谈谈python200行有趣小程序,以及python简单小游戏代码,希望对各位有所帮助,不要忘了收藏本站喔。 经常听到有朋友说,学习编程是一件非常枯燥无味的事情。其实,大家有没有认真想过,可能是我们的学习方法不对? 比方说,你有没有想过,可以通过打游

    2024年01月17日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包