??? 05/28/12 12:33 Read: times |
#187558 - C don't do full evaluation of logical expressions Responding to: ???'s previous message |
Justin Fontes said:
The while(1) is known to always compare and it even makes sense in the parameters passed in to the for statement as there is nothing to compare. No - a while loop is not known to always compare. It is only known to always require an expression. But it's up to the compiler to decide what code to generate if that expression can be computed at compile time. The logic performed seems to be the same, but again, technically, that's incorrect. The middle is definitely the same but the end logic is different.
The first if statement will guarantee that all conditions are tested before moving on to some other task. Although, if the first parameter fails, one can move on. So, if you want speed, the next if statement will prioritize those compares for you and if one fails a compare jumps out of the comparison. No - the C compiler likes early out, so you can write code like: if ((num_elements != 0) && ((total_bytes / num_elements) > 5)) { ... } Let's look at some code generated by gcc: int test(int a,int b,int c) { if (a && !b && !c) { return 1; } return 0; } Produces the following code for a x86 processor: .globl test .type test, @function test: pushl %ebp movl %esp, %ebp subl $4, %esp cmpl $0, 8(%ebp) je .L2 <= instant out if a is zero cmpl $0, 12(%ebp) jne .L2 <= instant out if b is non-zero cmpl $0, 16(%ebp) jne .L2 <= instant out if c is non-zero movl $1, -4(%ebp) <= Return value if "if" statement did match jmp .L3 .L2: movl $0, -4(%ebp) <= Return value if "if" statement didn't match .L3: movl -4(%ebp), %eax leave ret .size test, .-test In order to jump out of all those compares extra processes are added so that cpu time is not dedicated to comparing statements that will inherently not make a difference. Which means that you are definitely not guaranteed to test all of the parameters and hence it is not the same. And above example shows you wrong. I'll leave it up to you to take a closer took at the C standard and figure out the relevant paragraphs. |