由一个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
- 由一个iOS单利写法引发的C语言运算符优先级血案。
- 一个运算符优先级问题引发的血案
- Verilog 运算符优先级引发的血案
- 一个由字符集引发的血案
- 一个由session.close()引发的血案
- 由一个stack OOM引发的血案
- 一个由正则表达式引发的血案
- iOS 单利的写法
- 类型混用引发的血案(C语言)
- 由MD5引发的血案
- 由bind引发的血案
- IOS开发---C语言-④运算符的优先级
- 一个C语言运算符优先级导致的问题
- 一个C语言运算符优先级导致的问题
- 一个由内存泄漏引发的血案-Square
- java 之 Serialable 由一个馒头引发的血案
- 一个 * 引发的血案
- 一个“-”引发的血案
- 苹果ANCS协议分析
- 华为2014校园招聘的机试题目--字符串压缩
- Android知识点——内容提供者和内容观察者ContentProvider ContentResolver
- 浅析TLD算法
- 在IIS上启用Gzip压缩(HTTP压缩)
- 由一个iOS单利写法引发的C语言运算符优先级血案。
- 解决gitosis.init.InsecureSSHKeyUsername: Username contains not allowed characters问题
- 投资理念:什么样的股权众筹项目才是值得投资的?
- C++ primer ——3.2.3节
- Mac—为任意操作添加快捷键
- 51nod 1433 0和5 (水题)
- 帮你提升 Python 的 27 种编程语言
- 单例的创建
- 百度地图离线API开发(真正的离线开发)