Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
Per Westermark
05/28/12 06:33
Read: 614 times
Sweden


 
#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.

List of 33 messages in thread
TopicAuthorDate
Where can one learn Intermediate C techniques for 8051      David Good      05/22/12 17:42      
   on the right track        Maarten Brock      05/23/12 06:11      
      one more thing      Erik Malund      05/23/12 07:15      
         Not uncommon bid bad coding standards to comply with      Per Westermark      05/23/12 08:14      
         Not afraid of globals, but...      David Good      05/23/12 10:07      
   More keil optimizer interesting tidbits      David Good      05/24/12 16:24      
      optimization      Maarten Brock      05/25/12 05:35      
      nothing gained, nothing lost      Erik Malund      05/25/12 07:53      
         I don't      Per Westermark      05/25/12 07:58      
            you can do both      Erik Malund      05/25/12 09:44      
               That is not helping the compiler      Justin Fontes      05/25/12 16:31      
                  exact same      Maarten Brock      05/26/12 03:36      
                     Technically, they are not the same      Justin Fontes      05/26/12 11:17      
                        Hmmm...      Andy Neil      05/26/12 23:46      
                        C don't do full evaluation of logical expressions      Per Westermark      05/28/12 06:33      
                           In discrete mathematics proving one is not a proof      Justin Fontes      05/28/12 14:02      
                              Lazy evaluation demanded        Per Westermark      05/28/12 14:51      
                                 I have learned something new because of this      Justin Fontes      05/28/12 17:54      
                                    me too      Andy Peters      06/01/12 11:43      
                                       Very Important      Michael Karas      06/01/12 14:30      
                              Breaks.      Michael Karas      05/28/12 17:57      
                                 Compile the code      Justin Fontes      05/28/12 18:28      
                                    To be more exact      Justin Fontes      05/28/12 19:11      
                                       Stop It!!        Michael Karas      05/28/12 22:01      
                                          That is exactly what I intended      Justin Fontes      05/29/12 10:16      
                                             Switch Break.      Michael Karas      05/29/12 22:04      
               obfusciating code to help the compiler is a VERY bad idea      Andy Neil      05/27/12 07:13      
                  the source of this      Erik Malund      05/27/12 07:17      
   Where can one learn Intermediate C techniques for 8051      Andy Neil      05/26/12 23:56      
   Getting the least out of your compiler        Andy Neil      05/27/12 07:25      
      Maybe IAR should follow their own advice?      Christoph Franck      05/30/12 02:05      
         provided the case ...      Maarten Brock      05/30/12 06:29      
            Compilers not knowing the target chip.      Christoph Franck      05/31/12 03:19      

Back to Subject List