Em seg., 3 de ago. de 2020 às 12:18, Panagiotis Koutsourakis < panagiotis.koutsourakis@monetdbsolutions.com> escreveu:
Hi Ranier,
On 8/3/20 4:59 PM, Ranier Vilela wrote:
Em seg., 3 de ago. de 2020 às 10:53, Gregory Burd
escreveu: Sjoerd,
Nice explanation, so if they are both correct and one avoids unnecessary work (even just a tiny bit) why not adjust the code to add your explanation as a comment and use the more efficient version?
I'm not sure that is correct. It is the equivalent of writing: if (b->key)
To see that the code is correct, you can write down the truth table of the *bitwise* AND operator:
| b->ttype != TYPE_void | b->tkey || (b->ttype != TYPE_void) & b->tkey |
|-----------------------+--------------++-----------------------------------| | false (== 0) | false (== 0) || 0 (== false) | | true (== 1) | false (== 0) || 0 (== false) | | false (== 0) | true (== 1) || 0 (== false) | | true (== 1) | true (== 1) || 1 (== true) |
With a little thought you can see that this is the same as the *logical* AND operator. It works because both operands are of type bool, so their values are 0 for false and 1 for true in C99 if you cast them to integral types. (see for example the answers to this Stack Overflow question: https://stackoverflow.com/questions/4767923/c99-boolean-data-type)
As Sjoerd wrote in his email the only difference might be a performance penalty in case the first operand is true, if the second operand is expensive to evaluate. This is not the case here because b->tkey is a bool value so its evaluation is cheap.
In any case, if you find a particular set of inputs where this (or any other) part of the code produces wrong results we would be interested to see a bug report.
int main () { bool r = true; bool key = false; 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; } output: true true output: true false Always output the key value, be true or false: try: key = true or key = false Again (&) bitwise is not shortcut and only with C++ that bool is guaranted whatever 0 or 1. regards, Ranier Vilela