Adam D. Ruppe:

> Oh no! Eyeballing again showed a problem.. I should have put parens in my 
> asserts:
> a | b < f(a,b)   !=  (a|b) < f(a,b)

Bugs are gold nuggets! Yes, the precedence of bitwise operators is low, it's an 
error-prone thing, it's a part of C/C++/D that causes frequent bugs in programs 
written by everybody. I add extra parentheses when I use bitwise operators.

Unfortunately I don't see a simple way to remove this significant source of 
bugs from the D2 language.

When you switch on full warnings GCC warns you about few possible similar 
errors, suggesting to add parentheses to remove some ambiguity (for the eyes of 
the programmers).

This is a small example in C:

#include "stdio.h"
#include "stdlib.h"
int main() {
    int a = atoi("10");
    int b = atoi("20");
    int c = atoi("30");
    printf("%u\n", a|b <= c);
    return 0;
}

If you compile it with GCC (I am using gcc 4.4.1):

...>gcc -Wall test.c -o test
test.c: In function 'main':
test.c:9: warning: suggest parentheses around comparison in operand of '|'

You always use -Wall (and other warnings) when you write C code. So in this 
case the C language+compiler is able to catch a bug like yours :-)

Bye,
bearophile

Reply via email to