C语法陷阱:从变量与函数的声明到类型转换符

一个转换“恐慌区”到“学习区”的过程
服务器君一共花费了277.160 ms进行了6次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

程序设计错误,或者你无法按某个算法写出程序,实际上反应的是程序员与该程序与算法的“心智模式”不匹配,或者说,你的心智模式无法包容与理解下该程序算法所包含的思想(如果你不了解心智模式,可以到这里看看:心智模式专题)。

比如下面的一个语句:

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

这是一个什么东西呢?

像这样的表达式恐怕会令大部分C/C++程序员的内心都“不寒而栗”吧。这是一个当计算机启动时,硬件将调用首地址为0位置的子例程。

看不懂也不用担心,这个知识目前处于你学习的“恐慌区”,接下来我们慢慢将它变成你学习的“学习区”,再熟练下,它就会简单成为你学习的“舒适区”了。学习就是这样,不断把“恐慌区”的知识转化成“学习区”,再转化成“舒适区”,你转化得越多,你就越是别人眼里的“大牛”。

从最简单开始,慢慢理解与深入。

最简单的声明

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

float f , g ;

这个声明的含义是:当对其求值时,表达式f和g的类型为浮点数类型(float)。这个很简单,大家都懂。

因为声明符与表达式的相似,所以我们也可以在声明符中任意使用括号:

float ((f));

这个声明的含义是:当对其求值时,((f))的类型为浮点类型,由此可以推知,f也是浮点类型。一个简单的程序例子:

#include "stdio.h"

int main()
{
    float ((f)) = 0.5;
    printf("%.2f", f);
}

同样的逻辑也适用于函数和指针类型的声明,例如:

float ff();

这个声明的含义是:表达式ff()求值结果是一个浮点数,也就是说,ff是一个返回值为浮点类型的函数。类似地,

float *pf;

这个声明的含义是*pf是一个浮点数,也就是说,pf是一个指向浮点数的指针。

以上这些形式在声明中还可以组合起来,就像在表达式中进行组合一样。因此,

float *g(), (*h)();

表示*g()与(*h)()是浮点表达式。因为()结合优先级高于*,*g()也就是*(g()):g是一个函数,该函数的返回值类型为指向浮点数的指针。同理,可以得出h是一个函数指针,h所指向函数的返回值为浮点类型。

从声明到类型转换符

一旦我们知道了如何声明一个给定类型的变量,那么该类型的类型转换符就很容易得到了:只需要把声明中的变量名和声明末尾的分号去掉,再将剩余的部分用一个括号整个“封装”起来即可。例如,因为下面的声明:

float (*h)();

表示h是一个指向返回值为浮点类型的函数的指针,因此,

(float (*)())

表示一个“指向返回值为浮点类型的函数的指针”的类型转换符

拥有了这些预备知识,我们在下一篇就可以分两步来分析表达式 (*(void(*)())0)() 。

延伸阅读

此文章所在专题列表如下:

  1. C语法陷阱:从变量与函数的声明到类型转换符
  2. C语法陷阱:理解(*(void(*)())0)()
  3. C语法陷阱:理解如何声明一个数组
  4. C语法陷阱:指针与数组
  5. C语法陷阱:C语言的二维数组模拟

本文地址:http://www.nowamagic.net/librarys/veda/detail/2019,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/2019

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《重来:更为简单有效的商业思维》 贾森•弗里德(Jason Fried) (作者), 大卫•汉森(David Heinemeier Hansson) (作者), Mike Rohde (插图作者), 李瑜偲 (译者)

这本书呈现的是一种更好、更简单的经商成功之道。读完这本书,你就会明白为什么计划实际上百害而无一益,为什么你不需要外界投资人,为什么将竞争视而不见反倒会发展得更好。事实是你所需要的比你想象的少得多。你不必成为工作狂,你不必大量招兵买马,你不必把时间浪费在案头工作和会议上,你甚至不必拥有一间办公室。所有这些都仅仅是借口!

更多计算机宝库...