Combining conditions: logical operators

So far, we've been using if and else with "simple" conditions. But what if we want to combine conditions? For example, we might want to give the player an extra card if there are cards left in the pack and the player has less than 5 cards in their hand. To do this, we use what are sometimes called logical operators: things like "and", "or", "not".

And

The and operator looks as follows:

if (cardsLeftInPack > 0 && cardsInHand < 5) {
  ...
}

Note that we put two "and" symbols (&&).

Or

To check for one condition or the other, we use two pipe symbols. This is the vertical line that on many keyboards is obtained by holding down SHIFT and pressing the button to the left of the Z key. (On some other common layouts, you hold down CTRL and SHIFT and press the 1 key.) The code then looks as follows:

if (timesTableNo != 10 || n >= 5) {
  System.out.println(timesTableNo + " x " + n + " ...);
}

Note that or means if either of the conditions is true, or if both conditions are true1. So this code would print out the line if the times table number was not 10, or if n was at least 5. In other words, it would print out the whole times table in the case of times tables other than 10, but for the 10 times table, would print out the table from 5x10 onwards.

Not

We can use the Java else statement to add some code to be executed when a given condition isn't met. But we can also write a condition that means "if not ...". The Java symbol for not in this case is the exclamation mark !. So if we want to write "if it isn't true that there are cards left in the pack and the player has fewer than 5 cards", then we can write:

if (!(cardsLeftInPack > 0 && cardsInHand < 5)) {
  System.out.println("You can't have more cards!");
}

Notice how in this case, we put extra brackets around the whole condition that we want to negate. In reality, it's often possible to avoid using !. For example, in this case, we could have written:

if (cardsLeftInPack == 0 || cardsInHand >= 5)) {
  System.out.println("You can't have more cards!");
}

Arguably, this version is a bit clearer: just as people generally have trouble interpreting sentences with too many "nots" in them2, in programming, people appear to find it harder to interpret conditions with nots in them versus equivalent conditions without them.

Next: arrays

On the next page, we look at arrays in Java, which allow us to deal with a "row of pigeon holes" rather than singly labelled variables.


1. If you need the notion of either but not both, there exists the "hat" operator ^, but in reality it is rarely used.
2. People often have trouble deciding between sentences such as No program is too trivial to debug vs No program is too trivial not to debug. In other words, we often have trouble "getting the right combination of nots". In human language, we can cope with this illogicality most of the time, but in computer programming, your lines of code will be interpreted literally!


If you enjoy this Java programming article, please share with friends and colleagues. Follow the author on Twitter for the latest news and rants.

Editorial page content written by Neil Coffey. Copyright © Javamex UK 2021. All rights reserved.