Không, không có vấn đề về hiệu suất nào được kết hợp với toán tử so sánh. Và bất kỳ trình biên dịch tốt sẽ tối ưu hóa một cái gì đó tầm thường này anyway.
Tôi không chắc chắn nơi bạn có đề xuất sử dụng "i> -1" thay vì "i> = 0". Trên kiến trúc x86, nó làm cho không có sự khác biệt mà bạn sử dụng: cả hai trường hợp mất đúng hai hướng dẫn ... một để so sánh và một để nhảy:
;; if (i > -1) {
cmp eax, -1
jle else
then:
...
else:
;; if (i >= 0) {
cmp eax, 0
jl else
then:
...
else:
Trên hầu hết các kiến trúc RISC mà tôi biết, "i> = 0 "thực sự có thể nhanh hơn vì thường có một thanh ghi số không chuyên dụng, và" i> -1 "có thể yêu cầu tải một hằng số. Ví dụ, MIPS chỉ có một hướng dẫn < (không có < =). (! Ngây thơ) Sau đây là cách hai cấu trúc sẽ được thể hiện trong MIPS ngôn ngữ lắp ráp:
// if (i >= 0) { (assuming i is in register %t0)
stl $t1, $0, $t0 // in C: t1 = (0 < t0)
beq $t1, $0, else // jump if t1 == 0, that is if t0 >= 0
nop
then:
...
else:
// if (i > -1) { (assuming i is in register %t0)
addi $t2, $0, -1 // in C: t2 = -1
stl $t1, $t2, $t0 // in C: t1 = (t2 < t0) = (-1 < t0)
bne $t1, $0, else // jump if t1 != 0, that is if t0 > -1
nop
then:
...
else:
Vì vậy, trong trường hợp ngây thơ, nói chung, nó sẽ thực sự là một hướng dẫn nhanh hơn để làm "i> = 0" trên MIPS . Tất nhiên, mã RISC được tối ưu hóa rất nhiều đến nỗi một trình biên dịch có thể sẽ thay đổi một trong hai chuỗi lệnh này gần như không nhận ra :-)
Vì vậy ... câu trả lời ngắn là không không, không có sự khác biệt.
'(không có không, không có sự khác biệt) =! (! (! (! Sự khác biệt))) =! (! Khác biệt)) = khác biệt';) –
@ M.kazemAkhgary, khó tranh luận với. Bây giờ tôi là loại cám dỗ để thêm một thứ 5 "không" :-P –