今天写篇小短文,记录代码中有趣的知识点。
前面文章提到过,我目前在做基于AP标准someip协议栈的开发,而AP要求使用C++作为开发语言。由于公司开发的someip协议栈使用C语言,因而无法适用于AP。为了保证任务顺利完成当前首要目标是将现有的someip协议栈代码逻辑梳理清楚。
今天在梳理代码的过程中,看到了一行很有趣的代码。为防泄密,我将代码进行了修改,最后一行代码就是本文讨论的重点。
struct test { int a; } sizeof((struct test*)0)->a;
最初看到这行代码,我以为是别人写就的bug。然而这个协议栈非常成熟,已经被多家OEM使用。如果有问题应该早就暴漏了才对,因此一定是我对于代码的理解有问题。对着代码思考了几分钟,毫无头绪。
我始终认为sizeof((struct test*)0)返回的应该是整型数字,为什么整型数字后面可以使用“->”运算符?
难道是我对sizeof()的理解有偏差,它还有其他用法?
上网搜索了sizeof的定义,读了下面这段话,一切疑惑烟消云散,果然是我对sizeof()的理解不够深刻。如果还不明白,请耐心听我细细道来。
上图中“在C语言中,sizeof()是一个判断数据类型或者表达式长度的运算符”,这句话中的“运算符”就是最终的答案。
对!sizeof()不是函数,而是与“+”、“*”一样的运算符。
提到运算符,大家肯定会联想到运算符优先级,那么咱们回头看上面那行代码:
sizeof((struct test*)0)->a;
这行代码中有“()”、“->”、“sizeof()”三种运算符。优先级最高的当然是()运算符,->运算符优先级次之,sizeof()运算符优先级最低。
我们可以将代码改为下面的形式,因此这行代码的目的是为了获取struct test中成员变量a的长度。
sizeof(((struct test*)0)->a);
至此,所有的疑惑全部解开。今天的这个知识点虽小,但反映出两个问题:
1. 对于sizeof()的理解不够深刻,之前虽说会使用sizeof,但不知道是运算符
2. 这种编码方式会给增加代码阅读难度,在以后的编码过程中应引以为戒,尽量使用()划分优先级
作者:程序猿司晨
文章来源:上汽零束SOA开发者论坛
原文链接: