Logical Operators Truth Tests
Logical Operators/Truth Tests
Logical operators perform Boolean (TRUE/FALSE) comparisons on an expression. Since NWNScript does not support a strict Boolean data type, the result of a logical operation will be an int value of either FALSE (0) or TRUE (1).
Logical Operators
Symbol | Conditional |
---|---|
== | Equality test ("is equal to"). |
!= | Inequality test ("is not equal to"). |
< | Less than equality test. |
> | Greater than equality test. |
<= | Less than or equal to equality test. |
>= | Greater than or equal to equality test. |
&& | Short circuit logical AND. |
& | Bitwise AND. |
|| | Short circuit logical OR. |
| | Bitwise OR. |
! | Logical NOT. |
The following expressions all equate to TRUE or 1:
The following examples all equate to FALSE or 0:
One good use for logical operators is to test multiple expressions in a single if statement. This will prevent unnecessary nested if statements which make code difficult to follow, and in some cases slower.
The Logical NOT operator is an exception because it's a unary operator (only operates on a single expression):
In this example bRunTest will equate to 0 or FALSE.
It should be noted that && and || are considered short-circuit operators: that is, in an && conditional the first condition to evaluate as FALSE from left-to-right stops evaluation of the remaining statements, and in an || conditional the first condition to evaluate as TRUE from left-to-right stops evaluation of the remaining statements. What does this mean? Suppose you had two functions and either function returns TRUE or FALSE:
{
// check to see if a specific item is in the player's inventory
int bRet = FALSE;
bRet = GetItemPossessedBy(OBJECT_SELF, "some_item");
PrintInteger(bRet); // out to the log file
return bRet;
}
int bFunction2()
{
// moves the camera around
SetCameraFacing(270.0f, CAMERA_TRANSITION_TYPE_SLOW);
// returns TRUE for absolutely no reason
return TRUE;
}
bFunction2, above, has what is known as a side effect. That means that although it is a function, it also causes something else to happen as well. When we use a short circuit AND operator (&&)...
If OBJECT_SELF does not have the item "some_item" then bFunction2() will never be called, thus the camera angle will never change. Contrast that to the following:
In this second example, the camera angle will be changed because we are not using a short circuit operator; the entire statement will be evaluated.
Don't get "==" confused with the assignment operator "="! Assigning a statement to a value always returns TRUE and is a common source of bugs in code.
Finally because "==", "!=", "<", ">", "<=", and ">=" return TRUE or FALSE, you can use them for shortcuts when assigning values to boolean (TRUE/FALSE) integers. For example, the following code:
can become a single line of code:
author: Ryan Hunt, editors: Charles Feduke, Mistress, additional contributors: Bradley Beacham, ccaswell, Ken Cotterill