由一个iOS单利写法引发的C语言运算符优先级血案。

来源:互联网 发布:java 断点 编译后 存在 编辑:程序博客网 时间:2024/06/04 07:07

至于这么长的题目,我只想说:别打脸!其实故事是这样的。。。
看到网上苹果官方的单利写法,觉得满精炼的,想自己敲出来单步调试一下,看看能不能发现新大陆,代码如下(只改了类名):

+ (SingletonViewController *)shareViewCOntroller{    static SingletonViewController *singletonVC = nil;    static dispatch_once_t predicate;    dispatch_once(&predicate, ^{        singletonVC = [[self alloc] init];    });    return singletonVC;}

于是发在3只程序员(我室友&我弟&我)的微信群里,结果,我室友发来两个小截图:
1: 这里写图片描述

2: 这里写图片描述
说让你们看看我们公司的单利。这分别是他们公司对于单利的声明和实现。

我弟秒给方法:用字符串!获得类名!声明是一个宏!实现也是一个宏!传递的类名参数也是一个宏!
这个方法确实是正解。我想自己实现以下。于是就去研究宏定义了,结果。。一不小心发现了黑魔法:

这篇文章对于宏定义讲的很好!从最基础的一个表达式宏定义到复杂函数。

但是看到了运算符优先级的地方,我发现看不懂了,因为不知道优先级,于是就去研究并敲代码实验了一番,发现了博主写的表达式是错误的。

因为三目运算符确实麻烦,我就在这里把我研究的和大家分享一下。

/* 要研究的表达式 */int a = ( 3 < 4  > 5  ? 9 : 5 ? 3 : 4 < 5 ? 4 : 5);

首先查阅了百科的C语言运算符优先级表

知道了 “<” 、”>” 的优先级高于三目运算符”?:”,于是就有:

a = (( ( 3 < 4 )  > 5 ) ? 9 : 5 ? 3 : 4 < 5 ? 4 : 5);

然后发现里面有3个三目运算符”?:”,因为他们是平级,所以从左到右运算,从最左边的”?”开始,由于三目运算符是右结合性,也就是说离第一个”?”最近的”:”右边的内容是需要先结合的,于是又有:

a = (( ( 3 < 4 )  > 5 ) ? 9 :( 5 ? 3 : 4 < 5 ? 4 : 5 ));

以此类推,最终结果就是:

a = (( ( 3 < 4 )  > 5 ) ? 9 :( 5 ? 3 :((4 < 5)? 4 : 5)));//单步运算结果分析:a = ((     1      > 5 ) ? 9 :( 5 ? 3 :((4 < 5)? 4 : 5)));a = (         0         ? 9 :( 5 ? 3 :((4 < 5)? 4 : 5)));a = (         0         ? 9 :( 5 ? 3 :((4 < 5)? 4 : 5)));a = (                        ( 5 ? 3 :((4 < 5)? 4 : 5)));a =                                3                    ;

附:Xcode调试截图:
这里写图片描述
打印结果:
这里写图片描述

怎么样,是不是很虐心?哈哈哈 如有不懂,欢迎留言交流研讨~

0 0