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