if语句中的三元

时间:2014-04-23 15:25:22

标签: ternary-operator

看过这个问题: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不人道的事情)?

1 个答案:

答案 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
---