OK, I'm a little embarassed to ask this question, but I just want to be sure...
It is known that C uses short circuit evaluation in boolean expressions:
int c = 0;
if (c && func(c)) { /* whatever... */ }
In that example func(c)
is not called because c
evaluates to 0
. But how about more sophisticated example where side effects of comparison would change the variable being compared next? Like this:
int c; /* this is not even initialized... */
if (canInitWithSomeValue(&c) && c == SOMETHING) { /*...*/ }
Function canInitWithSomeValue
returns true and changes value at given pointer in case of success. Is it guaranteed that subsequent comparisons (c == SOMETHING
in this example) uses value set by canInitWithSomeValue(&c)
?
No matter how heavy optimizations the compiler uses?