Table of Contents

Comparison operators take two operands and evaluate to a boolean value which describes a relationship between the given values. Comparison operators are frequently used with conditionals.

== & != Operators

The == (equality) operator compares two operands and returns true if they are the same and false if they are not. The != (inequality) operator performs the inverse operation, returning false if they are the same and true if they are not.

Left Operand Operator Right Operand Result
true == false false
true != true false
true != false true

The equality operator is very useful when trying to identify unknown data, or verifying existing data.

if(unknownObject == this.TargetObject)
{
  Console.WriteLine("Found Target");
}
if(this.Owner.Player.TeamId == hitObject.Player.TeamId)
  Console.WriteLine("Friendly Fire!");

Keep in mind that the values of the operands must be exactly equal. When comparing decimal values, the differences may be very small but still exist, i.e. 3.14159 == 3.141591 will evaluate to false. Similarly 2.236068 == 2.23607 will evaluate to false, as the values differ by 0.0000002. It is common to use an epsilon value (i.e. 0.0000001) when comparing values that are more precise then the comparison needs to be.

The != operator is commonly used to verify data exists before attempting to use it.

if(unknownObject != null)
{
  Console.WriteLine(`unkownObject` is valid);
  if(unknownObject.Transform != null)
    Console.WriteLine(unkownObject.Transform.Translation);
  else
    Console.WriteLine("`unkownObject` does not have a Tranform component");
}

Object Comparison

As seen in the first code block, object comparison is fairly common. However, there are a few details to be aware of when comparing objects by value vs. by reference.

NOTE: To read about the details about by-value and by-reference objects, read the manual page.

Object Comparison by Value

Take the following struct as a by-value example:

struct ValueObj
{
  var ValueOne : Boolean;
  var ValueTwo : Integer;
  var ValueThree : Boolean;
}

In Nada, structs are value types, so when they're compared using the == or != operators, the value(s) within the type are what is compared. This means that the == and != operators cannot be used with references to structs to determine if the operands are the same struct instance.

var a = ValueObj();
var b = a;
var c = ValueObj();
Console.WriteLine("a & b are equal: `a == b`");

b.ValueOne = true;
Console.WriteLine("a & b are equal: `a == b`");

Console.WriteLine("a & c are equal: `a == c`");
Console.WriteLine("b & c are equal: `b == c`");
a & b are equal: true
a & b are equal: false
a & c are equal: true
b & c are equal: false

In this case, the ValueObj instances are constructed and compared by value. So despite b being a copy of a, when b.ValueOne is set to false, the value of a.ValueOne does not change, and the values of the two objects are no longer equal. Furthermore, it can be seen that even when ValueObj instance c, a new value type instance, is constructed, the ValueObj is only copied and compared by value.

Object Comparison by Reference

Take the following class as a by-reference example:

class ReferenceObj
{
  var ValueOne : Boolean;
  var ValueTwo : Integer;
  var ValueThree : Boolean;
}

In Nada, classes are reference types, so when they're compared using the == or != operators, what are actually compared are the addresses of the objects in memory. This means that the == and != operators cannot be used with class references to determine if the operands contain the same values; instead, they reveal whether the two objects are the same class instance.

var a = ReferenceObj();
var b = a;
var c = ReferenceObj();
Console.WriteLine("a & b are equal: `a == b`");

b.ValueOne = false;
Console.WriteLine("a & b are equal: `a == b`");

Console.WriteLine("a & c are equal: `a == c`");
Console.WriteLine("b & c are equal: `b == c`");
a & b are equal: true
a & b are equal: true
a & c are equal: false
b & c are equal: false

In this case, the ReferenceObj instances are constructed and compared by reference, so b is actually a copy of the reference a to the constructed ReferenceObj. This means that when b.ValueOne is set to true, the ReferenceObj instance that a references is modified, as a and b are in fact referencing the same ReferenceObj instance. Furthermore, looking at c, one can see that when a new reference type instance is constructed, it is only copied and compared by reference, so even when two instances contain the same value(s), they will not be considered equal.

Floating-Point Comparison

Due to floating-point error, it is best to avoid comparing two extremely precise or large values of floating-point types (such as Real) with the == and != operators. Consider:

Console.WriteLine(2000000000.0 == 2000000042.0);
true

This is not a quirk of the engine, it's a quirk of modern computing. Instead of using these operators, it is best to use a function like Math.ApproximatelyEqual (which can then be negated using the ! operator to check for inequality) for floating-point types. For example, instead of something like this:

if (this.Transform.WorldTranslation.Y == this.JumpHeight)
{
  //
}

... try something like this:

if (Math.ApproximatelyEqual(this.Transform.WorldTranslation.Y, this.JumpHeight, 0.01))
{
  //
}

> & < Operators

The > (greater than) operator returns true if the left operand is greater than// the right operand. The < (less than) operator returns true if the left operand is //less than the right operand.

Left Operand Operator Right Operand Result
1 > 1 false
2 > 1 true
0 < 1 true
1 < 1 false
2 < 1 false

< is often used to compare simulation values to detemine if a threshold has failed to be reached.

if(height < 5)
  Console.WriteLine("You must be at least 5ft tall to ride this attraction");

> is often used to compare simulation values to detemine if a threshold has been exceeded.

if(cost > 10)
  Console.WriteLine("That restaurant is not within my dinner budget");

>= & <= Operators

The >= (greater than or equal to) operator returns true if the left operand is greater than or equal to// the right operand. The <= (less than or equal to) operator returns true if the left operand is //less than or equal to the right operand.

Left Operand Operator Right Operand Result
1 >= 1 true
2 >= 1 true
0 <= 1 true
1 <= 1 true
2 <= 1 false

<= is often used to compare simulation values to detemine if a threshold has failed to be exceeded.

if(cost <= 10)
  Console.WriteLine("That restaurant is within my dinner budget");

> is often used to compare simulation values to detemine if a threshold has been exceeded.

if(height >= 5)
  Console.WriteLine("You are at least 5ft tall, you may ride this attraction");

Related Materials

Manual

Tasks

  • {T556}