aboutsummaryrefslogtreecommitdiffstats
path: root/source/arduino/comparison.rst
blob: e5e92d7afb84ce2548fbe8f0dea26ee1b27ed9df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
.. highlight:: cpp

.. _arduino-comparison:

Comparison Operators
====================

The comparison operators ``==``, ``!=``, ``<``, ``>``, ``<=``, and
``>=`` are used to compare two numbers.  They are :ref:`true
<arduino-constants-true>` when the comparison is true, and :ref:`false
<arduino-constants-false>` otherwise.  They are based on the symbols
=, ≠, <, >, ≤, and ≥ from mathematics.

Here are some examples, with their meaning in comments::

     // "eq" is true when x is equal to y
     bool eq = (x == y);

     // "neq" is true when x is different than y
     bool neq = (x != y);

     // "lt" is true when x is less than, but NOT equal to, y
     bool lt = (x <  y);

     // "gt" is true when x is greater than, but NOT equal to, y
     bool gt = (x >  y);

     // "lte" is true when x is less than or equal to y
     bool lte = (x <= y);

     // "gte" is true when x is greater than or equal to y
     bool gte = (x >= y);

The parentheses are optional; they are present only for clarity.  For
example, the following two lines are the same::

    bool eq = x == y;

    bool eq = (x == y);

Uses
----

Comparison operators, along with :ref:`boolean operators
<arduino-boolean>`, are useful inside the conditionals of :ref:`if
<arduino-if>` statements.  Here's one example::

    if (x < 50) {
       // only execute these lines if x is less than 50
       SerialUSB.println("delaying:");
       SerialUSB.println(x);
       delay(x);
    }

.. warning::
   Beware of accidentally using the single equal sign (``=``) when you
   meant to test if two numbers are equal (``==``).  This is a common
   mistake inside of ``if`` statement conditionals, e.g.::

       // DON'T MAKE THIS MISTAKE
       if (x = 10) {
          // body
       }

   The single equal sign is the assignment operator, and sets x to 10
   (puts the value 10 into the variable x).  Instead use the double equal
   sign (e.g. ``if (x == 10)``), which is the comparison operator, and
   tests *whether* x is equal to 10 or not. The latter statement is only
   true if x equals 10, but the former statement will always be true.

   This is because C evaluates the statement ``if (x=10)`` as follows: 10
   is assigned to x (remember that the single equal sign is the
   :ref:`assignment operator <arduino-assignment>`), so x now
   contains 10. Then the 'if' conditional evaluates 10, which evaluates
   to :ref:`true <arduino-constants-true>`, since any non-zero number
   evaluates to ``true``.

   Consequently, the conditional of an ``if`` statement like ``if (x =
   10) {...}`` will always evaluate to ``true``, and the variable x
   will be set to 10, which is probably not what you meant.

   (This sometimes has uses, though, so just because an assignment
   appears within a conditional doesn't mean it's automatically wrong.
   Be careful to know what you mean.)


.. include:: cc-attribution.txt