A good answer might be:

Any function that returns any type of value can be used in a boolean expression, so side-effects are a concern.

Danger with any Method

For example, say that a method computeMaximum() computes the maximum value of some variables, stores the result in maximum and returns that value:

int maximum; // set by computeMaximum()
. . .

if ( sum < 100 && computeMaximum() < 500 ) 
{
  result = 2 * maximum ;   // maximum might not be computed.
}
. . .

There is a problem here. The method that follows && sets maximum (as a side effect) only when sum is greater than 100. The assignment statement will sometimes put the wrong value in result. You should arrange the expression like this:

int maximum;
. . .

if ( computeMaximum() < 500 && sum < 100 ) 
{
  result = 2 * maximum ;
}
. . .

With this arrangement the side effect will always happen. The two if statements look almost identical; however, the first one is a bug (probably). Bugs like this can be hard to find.

The best solution is to write computeMaximum() so that it has no side effect, then use it like this:

int maximum;
. . .
maximum = computeMaximum();

if ( maximum < 500 && sum < 100 ) 
{
  result = 2 * maximum ;  
}
. . .


QUESTION 4:

Would it be useful to have a non-short-circuit AND operator?