2014-04-23 2 views
-3

이 질문을 보니 : To ternary or not to ternary?, 그러나 실제로이 상황에 대한 답을 제공하지는 못했습니다.if 서술문

필자는 내 말에 따르면, 논리에 더 많은 정보를 제공하고 실제로 작동하는 데 필요한 작업이 적기 때문에 if 문에서 3 진을 사용했습니다. 예를 들어 if (a == 'foo' ? b != 'poo' : true)이 있는데 이는 물론 if ((a == 'foo' && b != 'poo') || a != 'foo')으로 바꿀 수 있습니다. 연산 수를 3과 2, 3을 2와 3으로 나눈 값을 비교하면 (물론 이것은 간단한 예입니다. 차이가 1보다 큰 예제도 만들 수 있습니다.) 또한 연산 수를 비 - 삼항 (적어도 나를 위해); 그러나 동료들은 왜 그러한 대회를 채택했는지 묻고 있습니다.

조건 내에 3 진수를 사용할 때주의해야 할 사항이 있습니다 (가독성을 위해 따로 따로 분리 해두 고 있습니다 .- 나는 여전히 a ? b ? c ? d : e : f : g을 비 분석으로 간주하고 있습니다)?

답변

1

if 문에서 삼항 문자를 사용하는 것은 예상 밖의 다른 이유로 인해 잘못된 생각입니다. 또한 논리적으로 따라하기가 더 어렵습니다. 제 생각에 삼중 항을 조건 적으로 변환했습니다. 그런 식으로 생각하는 것이 더 의미가 있습니다. 조건을 생각해 보면, 나는 "and"와 "or"의 관점에서 "if ... then ... else"를 생각하지 않을 것이다. 그리고 나는 대부분의 개발자가 그것에 동의 할 것이라고 생각한다.

마지막으로 디스 어셈블리를보십시오. OSX에서 clang을 사용하면 삼진에 jmp이 하나 더있는 것을 제외하고는 동일합니다. 귀하의 "적은 운영"주장이 잘못되었습니다.

삼항

_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 

DIFF을 제외한 이름 (< = ternary)

20,22c20,21 
< jmp LBB0_4 
--- 
+0

흠 ... 것이 이유가 궁금 - 삼항 작업 (후인가?)는 조건에 관계없이 평가됩니다 (?). 예기치 않은'if (if()()')에 동의 할 수 있지만 거기에 숨어있는 것이 더 나쁜지 알고 싶습니다. – eithed