之前的笔记搬运
0x1 什么是三目运算符
1 | 三目运算符是一个条件分支语句, 根据表达式1的结果来决定执行表达式2还是表达式3 |
0x2 三目运算符的优化
1 | 三目运算符优化也是有条件的, 必须当表达式2和表达式3都为常量时, 才有被优化的可能性, 当表达式2和3都为常量,或其中一个为常量时, 这时候会被编译成一个条件分支语句, 而当表达式为1为常量时, 在编译时就会得到答案, 将不会生成分支语句 |
三目运算符的优化方案:
方案1: 表达式1为简单比较, 而表达式2和3两者差值等于11
2
3
4
5
6
7
8
9
10
11
12
13
14printf("%d", argc == 5 ? 5 : 6);
;清空eax
00E91003 33 C0 xor eax,eax
;表达式1的比较
00E91005 83 7D 08 05 cmp dword ptr [argc],5
;setxx系列指令和jxx指令一样, xx代表条件ne代表不等于l代表小于等等, set指令只能操作低8位, 所以使用前需要把寄存器清0
;这里setne表示不等于, 检查ZF标志位, ZF==1时al为0,反之al为1
00E91009 0F 95 C0 setne al
;在这个时候,eax值不是为1就是为0, 与之相加实现了无分支求条件值
00E9100C 83 C0 05 add eax,5
方案2: 表达式1为简单比较, 而表达式2和3两者差值大于1
1 | 在VS2013下被优化成如下代码: |
方案3: 表达式1为复杂比较, 而表达式2和3两者差值大于1
1 | 在VS2013下被优化成如下代码: |