看过这个问题:To ternary or not to ternary?,但它并没有真正为我提供这种情况的答案。
我在if语句中一直使用三元组,因为根据我的说法,它提供了更多的逻辑,并且需要更少的操作来实际工作。此类陈述的一个示例是:if (a == 'foo' ? b != 'poo' : true)
,当然可以由if ((a == 'foo' && b != 'poo') || a != 'foo')
替换。如果比较操作的数量 - 三元组为1和2之间,非三元组为2和3(当然这是一个简单的例子 - 我也可以创建一个差异大于1的例子),它也比非三元的(至少对我而言);但是我的同事一直在问我为什么要采用这样的惯例。
在条件句中是否有任何使用三元组的警告(除了可读性之外 - 我还在考虑解析a ? b ? c ? d : e : f : g
不人道的事情)?
答案 0 :(得分:1)
在if语句中使用三元组是一个坏主意,如果没有其他原因,它是意外的。它在逻辑上也更难以遵循 - 我在心理上将你的三元素转换为有条件的,因为用这种方式思考它更有意义。如果我想到这些条件,我会考虑"和"和"或",不是"如果......那么......其他,"而且我认为大多数开发者会同意我的意见。
最后,看一下反汇编。在OSX上使用clang,除了三元组还有一个jmp
之外,它们是相同的。您的操作次数减少了#34;论证是错误的。
三元
_ternary: ## @ternary
.cfi_startproc
## BB#0:
pushq %rbp
Ltmp2:
.cfi_def_cfa_offset 16
Ltmp3:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp4:
.cfi_def_cfa_register %rbp
subq $16, %rsp
movl %edi, -4(%rbp)
movl %esi, -8(%rbp)
movl %edx, -12(%rbp)
cmpl $102, -4(%rbp)
jne LBB0_2
## BB#1:
cmpl $111, -8(%rbp)
je LBB0_3
jmp LBB0_4
LBB0_2:
cmpl $111, -12(%rbp)
jne LBB0_4
LBB0_3:
leaq L_.str(%rip), %rdi
callq _puts
movl %eax, -16(%rbp) ## 4-byte Spill
LBB0_4:
movl $0, %eax
addq $16, %rsp
popq %rbp
ret
.cfi_endproc
逻辑
_logical: ## @logical
.cfi_startproc
## BB#0:
pushq %rbp
Ltmp7:
.cfi_def_cfa_offset 16
Ltmp8:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp9:
.cfi_def_cfa_register %rbp
subq $16, %rsp
movl %edi, -4(%rbp)
movl %esi, -8(%rbp)
movl %edx, -12(%rbp)
cmpl $102, -4(%rbp)
jne LBB1_2
## BB#1:
cmpl $111, -8(%rbp)
je LBB1_3
LBB1_2:
cmpl $111, -12(%rbp)
jne LBB1_4
LBB1_3:
leaq L_.str1(%rip), %rdi
callq _puts
movl %eax, -16(%rbp) ## 4-byte Spill
LBB1_4:
movl $0, %eax
addq $16, %rsp
popq %rbp
ret
.cfi_endproc
差异,不包括命名(< = ternary
)
20,22c20,21
< jmp LBB0_4
---