This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

"else" instruction doesnt get xcuted

Hi All,
Using uVision simulator and Keil arm or
GNU compiler, the "else" instruction never gets xcuted. Using MSVC++ it does get xcuted.

Anyone know why?? puzzleing.
Thanks
----------------------------
int main (void){
unsigned int i=0,result=0;

for (i=0;i<5;i++){
if (i>3)
result=i*10;
else
result=i*5;
}

return(1);
}//main
--------------------------------

  • Perhaps the Keil optimizer is smarter.

    Looking at the entire loop, it's clear that eventually i must be > 3. In that case, result = i * 10. In fact, this will always occur when i == 4. So, you could replace the entire loop with one statement:

    i = 40;

    For that matter, even this line is useless, since the return is a fixed value. It could be eliminated as well.

    Take a look at the assembly listing and see what the code generator actually produces.
    One way to force the optimizer to preserve "unnecessary" writes is to declare the variables "volatile". Normally, volatile is used when the variable is actually affected by the scope of something other than the local code (hardware registers that change, variables shared with ISRs or other tasks).

    Or, turn optimization off, and see what happens.

  • The loop always runs until i>3, so the compiler is smart enough to realise that it doesn't need to bother with the 'else' clause, because its result will always be overwritten by the 'then' clause!

    In fact, you never use 'result' for anything - so the compiler could actually optimise the entire function to:

       return(1);
    and it would make no material difference to the operation of the system!

    No doubt you could find an MSVC optimisation setting that did the same...

    You could try making 'result' volatile...?

    BTW: what do you think will happen to the return value from main...?

  • >> BTW: what do you think will happen to the return value from main...?

    For what it's worth, GCC complains if main() does not return a value because it is declared to return type int. If you change it to return type void, it complains about that too, so having it return something keeps GCC happy.

    Kathy