Hi, I wrote: << This is the previous version compressed by using another && operand in the boolean expressions. The final sub-expression is an assignment, which always evaluates to true provided the other two sub-expressions evaluate to true. The final statement uses a similar strategy to compress statements. The key is that a chain of && statements must be always fully evaluated for the result of the whole expression to be known. A chain of || only need a sub-expression to evaluate to true for the result of the whole expression to be known. >>
I studied 'and' and 'or' boolean operators back when I studied Delphi Pascal. I am embarrassed to have written such a stupid thing. It must be due to the fact I wrote the email just before going to bed. AND: requires ALL sub-expressions to be true to evaluate to true i.e. Q = A ^ B ^ C ^ .... D Q = 1 if and only if A = B = C = .... D = 1 OR: only requires ONE sub-exression to be true to evaluate to true i.e. Q = A v B v C v .... D Q = 1 if any Ai = 1 These properties are used by compilers to optimize on boolean expression evaluation. If I remember well, there are also specific algorithms to optimize boolean evaluation. I can mention boolean expression simplification techniques as used to minimize the number of gates used in logic circuits. Thanks, Edward On 21/06/2016, KatolaZ <kato...@freaknet.org> wrote: > On Mon, Jun 20, 2016 at 10:12:40PM +0200, Edward Bartolo wrote: > > [cut] > >> int main (int argc, char *argv[]){ >> >> int c,d=0; >> while((c=getchar()) != EOF){ >> c=putchar(c); >> while(c == ' ' && (c=getchar()) != EOF && (d=1)); >> if (d && putchar(c) && (d=0)); >> } >> } >> >> >> >> This is the previous version compressed by using another && operand in >> the boolean expressions. The final sub-expression is an assignment, >> which always evaluates to true provided the other two sub-expressions > > No, this last sentence is not correct. The value of an assignment > expression is the value of the right-hand-side of the assignment, as > you can verify by running this little program: > > ==== > > #include <stdio.h> > > int main(){ > int c; > if (c = 0){ > printf("tadaaaa!\n"); > } > } > > ==== > > Note the condition of the if statement (c=0 and not c==0)... > >> evaluate to true. The final statement uses a similar strategy to >> compress statements. The key is that a chain of && statements must be >> always fully evaluated for the result of the whole expression to be >> known. A chain of || only need a sub-expression to evaluate to true >> for the result of the whole expression to be known. > > Also this is false. Each element of a chain of "&&" is evaluated until > one of the elements evaluate to FALSE (0), since in that case the > result of the && is known (and is equal to 0). The dual happens for > expressions chained through ||: each of them is evaluated until there > is one that evaluates to TRUE (!=0), because at that point the result > of the chain is known (and is equal to 1). > > This is called "operator short-circuiting", and can give rise to > pretty unreadable code in C... > > HND > > KatolaZ > > -- > [ ~.,_ Enzo Nicosia aka KatolaZ - GLUGCT -- Freaknet Medialab ] > [ "+. katolaz [at] freaknet.org --- katolaz [at] yahoo.it ] > [ @) http://kalos.mine.nu --- Devuan GNU + Linux User ] > [ @@) http://maths.qmul.ac.uk/~vnicosia -- GPG: 0B5F062F ] > [ (@@@) Twitter: @KatolaZ - skype: katolaz -- github: KatolaZ ] > _______________________________________________ Dng mailing list Dng@lists.dyne.org https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng