Em seg., 3 de ago. de 2020 às 13:22, Sjoerd Mullender <sjoerd@monetdb.org> escreveu:


On 03/08/2020 17.55, Ranier Vilela wrote:
> Em seg., 3 de ago. de 2020 às 12:50, Sjoerd Mullender
> <sjoerd@monetdb.org <mailto:sjoerd@monetdb.org>> escreveu:
>
>
>
>     On 03/08/2020 15.43, Ranier Vilela wrote:
>     > Em seg., 3 de ago. de 2020 às 04:02, Sjoerd Mullender
>     > <sjoerd@monetdb.org <mailto:sjoerd@monetdb.org>
>     <mailto:sjoerd@monetdb.org <mailto:sjoerd@monetdb.org>>> escreveu:
>     >
>     >     Either way is correct.
>     >
>     > Are we missing something?
>     >
>     >     The first form evaluates both (b->ttype != TYPE_void) and
>     b->tkey, both
>     >     of which result in either 0 or 1.  The single & does a
>     bit-wise AND on
>     >     those two values and results in 1 if both sides evaluated to 1.
>     >
>     >     In the second form, if first part evaluates to 0, b->tkey is not
>     >     evaluated,
>
> Sorry, see:
>  " In the second form, if first part evaluates to 0, b->tkey is not
> evaluated,"
> No matter the outcome of the first part, b-> key will always be evaluated.
>
>     and if the first part evaluates to 1, the second part is also
>     >     evaluated.  The restult, again, is only 1 if both sides
>     evaluate to 1.
>     >
>     > Wait, bitwse AND (&) is not shortcut, If first part evaluates to 0
>     > *b->key is stiil evaluated.*
>
>     That's correct.  I think I mentioned that.
>
> Sorry, but I think it contradicts your first email, you say "not
> evaluated".

I wrote (and I copy/paste):
"The first form evaluates both (b->ttype != TYPE_void) and b->tkey"
and
"In the second form, if first part evaluates to 0, b->tkey is not
evaluated"

The first form being the one with the bitwise &, the second form being
the one with the logical &&.

In any case, with & both sides are always evaluated and there is no
shortcut.  With && if the left side evaluates to 0, the right side is
not evaluated.
The thing is, in order to skip evaluation, a jump is needed over the
code that does the evaluation.  Conditional jumps may be expensive.  So
it may be faster to evaluate both sides (and not jump) than to skip
evaluation of one side at the cost of a conditional jump.  (It's the
conditionality that makes it potentially expensive.)
I agree with you about trick to gain performance.

But this:
if (b->ttype != TYPE_void) & b->tkey)

Is the same write:
if (b->key)

And if is correct, was that the original intention?

See:
int main ()
{
    bool r = true;
    bool key = true;
    const char * ptr = "not null";
    void * pvoid = NULL;

    r = (ptr == pvoid);
    if (r)
       printf("true\n");
    else
       printf("false\n");

    r = ((ptr == pvoid) & key);
    if (r)
       printf("true");
    else
       printf("false");
    return 0;
}

Here do not matters key value, always be output is false,
be key true or false.

See:
https://www.gamedev.net/forums/topic/514727-combining-c-bool-and-bitwise-operators/

regards,
Ranier Vilela