Showing posts with label Operators. Show all posts
Showing posts with label Operators. Show all posts

Operating with variables in C++

// operating with variables
#include <iostream>
using namespace std;
int main ()
{
// declaring variables:
int a, b;
int result;
// process:
a = 5;
b = 2;
a = a + 1;
result = a - b;
// print out the result:
cout << result;
// terminate the program:
return 0;
}
ouput : 4

Assignment operator (=) in C++

The assignment operator assigns a value to a variable.
a = 5;
This statement assigns the integer value 5 to the variable a. The part at the left of the assignment operator (=) is
known as the lvalue (left value) and the right one as the rvalue (right value). The lvalue has to be a variable
whereas the rvalue can be either a constant, a variable, the result of an operation or any combination of these.
The most important rule when assigning is the right-to-left rule: The assignment operation always takes place from
right to left, and never the other way:
a = b;
This statement assigns to variable a (the lvalue) the value contained in variable b (the rvalue). The value that was
stored until this moment in a is not considered at all in this operation, and in fact that value is lost.
Consider also that we are only assigning the value of b to a at the moment of the assignment operation. Therefore
a later change of b will not affect the new value of a.
For example, let us have a look at the following code - I have included the evolution of the content stored in the
variables as comments:
// assignment operator
#include <iostream>
using namespace std;
int main ()
{
int a, b; // a:?, b:?
a = 10; // a:10, b:?
b = 4; // a:10, b:4
a = b; // a:4, b:4
b = 7; // a:4, b:7
cout << "a:";
cout << a;
cout << " b:";
cout << b;
return 0;
}
a:4 b:7
This code will give us as result that the value contained in a is 4 and the one contained in b is 7. Notice how a was
not affected by the final modification of b, even though we declared a = b earlier (that is because of the right-toleft
rule).

A property that C++ has over other programming languages is that the assignment operation can be used as the
rvalue (or part of an rvalue) for another assignment operation. For example:
a = 2 + (b = 5);
is equivalent to:
b = 5;
a = 2 + b;
that means: first assign 5 to variable b and then assign to a the value 2 plus the result of the previous assignment
of b (i.e. 5), leaving a with a final value of 7.
The following expression is also valid in C++:
a = b = c = 5;
It assigns 5 to the all the three variables: a, b and c.

Arithmetic operators ( +, -, , , % ) in C++

Arithmetic operators ( +, -, , , % )

The five arithmetical operations supported by the C++ language are:
+ addition
- subtraction
* multiplication
/ division
% modulo
Operations of addition, subtraction, multiplication and division literally correspond with their respective
mathematical operators. The only one that you might not be so used to see is modulo; whose operator is the
percentage sign (%). Modulo is the operation that gives the remainder of a division of two values. For example, if
we write:
a = 11 % 3;
the variable a will contain the value 2, since 2 is the remainder from dividing 11 between 3.

Increase and decrease (++, --) operators in C++

Increase and decrease (++, --)

Shortening even more some expressions, the increase operator (++) and the decrease operator (--) increase or
reduce by one the value stored in a variable. They are equivalent to +=1 and to -=1, respectively. Thus:
c++;
c+=1;
c=c+1;
are all equivalent in its functionality: the three of them increase by one the value of c.
In the early C compilers, the three previous expressions probably produced different executable code depending on
which one was used. Nowadays, this type of code optimization is generally done automatically by the compiler,
thus the three expressions should produce exactly the same executable code.
A characteristic of this operator is that it can be used both as a prefix and as a suffix. That means that it can be
written either before the variable identifier (++a) or after it (a++). Although in simple expressions like a++ or ++a
both have exactly the same meaning, in other expressions in which the result of the increase or decrease operation
is evaluated as a value in an outer expression they may have an important difference in their meaning: In the case
that the increase operator is used as a prefix (++a) the value is increased before the result of the expression is
evaluated and therefore the increased value is considered in the outer expression; in case that it is used as a suffix
(a++) the value stored in a is increased after being evaluated and therefore the value stored before the increase
operation is evaluated in the outer expression. Notice the difference:
Example 1 Example 2
B=3;
A=++B;
// A contains 4, B contains 4
B=3;
A=B++;
// A contains 3, B contains 4
In Example 1, B is increased before its value is copied to A. While in Example 2, the value of B is copied to A and
then B is increased.

Relational and equality operators ( ==, !=, >, <, >=, <= ) in C++

Relational and equality operators ( ==, !=, >, <, >=, <= )

In order to evaluate a comparison between two expressions we can use the relational and equality operators. The
result of a relational operation is a Boolean value that can only be true or false, according to its Boolean result.
We may want to compare two expressions, for example, to know if they are equal or if one is greater than the
other is. Here is a list of the relational and equality operators that can be used in C++:

== Equal to
!= Not equal to
> Greater than
< Less than
>= Greater than or equal to
<= Less than or equal to
Here there are some examples:
(7 == 5) // evaluates to false.
(5 > 4) // evaluates to true.
(3 != 2) // evaluates to true.
(6 >= 6) // evaluates to true.
(5 < 5) // evaluates to false.
Of course, instead of using only numeric constants, we can use any valid expression, including variables. Suppose
that a=2, b=3 and c=6,
(a == 5) // evaluates to false since a is not equal to 5.
(a*b >= c) // evaluates to true since (2*3 >= 6) is true.
(b+4 > a*c) // evaluates to false since (3+4 > 2*6) is false.
((b=2) == a) // evaluates to true.
Be careful! The operator = (one equal sign) is not the same as the operator == (two equal signs), the first one is an
assignment operator (assigns the value at its right to the variable at its left) and the other one (==) is the equality
operator that compares whether both expressions in the two sides of it are equal to each other. Thus, in the last
expression ((b=2) == a), we first assigned the value 2 to b and then we compared it to a, that also stores the
value 2, so the result of the operation is true.

Logical operators ( !, &&, || ) in C++

Logical operators ( !, &&, || )
The Operator ! is the C++ operator to perform the Boolean operation NOT, it has only one operand, located at its
right, and the only thing that it does is to inverse the value of it, producing false if its operand is true and true if its
operand is false. Basically, it returns the opposite Boolean value of evaluating its operand. For example:
!(5 == 5) // evaluates to false because the expression at its right (5 == 5) is true.
!(6 <= 4) // evaluates to true because (6 <= 4) would be false.
!true // evaluates to false
!false // evaluates to true.
The logical operators && and || are used when evaluating two expressions to obtain a single relational result. The
operator && corresponds with Boolean logical operation AND. This operation results true if both its two operands
are true, and false otherwise. The following panel shows the result of operator && evaluating the expression a &&
b:
&& OPERATOR
a b a && b
true true true
true false false
false true false
false false false
The operator || corresponds with Boolean logical operation OR. This operation results true if either one of its two
operands is true, thus being false only when both operands are false themselves. Here are the possible results of a
|| b:

|| OPERATOR
a b a || b
true true true
true false true
false true true
false false false
For example:
( (5 == 5) && (3 > 6) ) // evaluates to false ( true && false ).
( (5 == 5) || (3 > 6) ) // evaluates to true ( true || false ).

Conditional operator ( ? ) in C++

Conditional operator ( ? )
The conditional operator evaluates an expression returning a value if that expression is true and a different one if
the expression is evaluated as false. Its format is:
condition ? result1 : result2
If condition is true the expression will return result1, if it is not it will return result2.
7==5 ? 4 : 3 // returns 3, since 7 is not equal to 5.
7==5+2 ? 4 : 3 // returns 4, since 7 is equal to 5+2.
5>3 ? a : b // returns the value of a, since 5 is greater than 3.
a>b ? a : b // returns whichever is greater, a or b.
// conditional operator
#include <iostream>
using namespace std;
int main ()
{
int a,b,c;
a=2;
b=7;
c = (a>b) ? a : b;
cout << c;
return 0;
}
7
In this example a was 2 and b was 7, so the expression being evaluated (a>b) was not true, thus the first value
specified after the question mark was discarded in favor of the second value (the one after the colon) which was b,
with a value of 7.

Comma operator ( , ) in C++

Comma operator ( , )
The comma operator (,) is used to separate two or more expressions that are included where only one expression
is expected. When the set of expressions has to be evaluated for a value, only the rightmost expression is
considered.
For example, the following code:
a = (b=3, b+2);
Would first assign the value 3 to b, and then assign b+2 to variable a. So, at the end, variable a would contain the
value 5 while variable b would contain value 3.

Bitwise Operators ( &, |, ^, ~, <<, >> )

Bitwise Operators ( &, |, ^, ~, <<, >> )
Bitwise operators modify variables considering the bit patterns that represent the values they store.
operator asm equivalent description
& AND Bitwise AND
| OR Bitwise Inclusive OR
^ XOR Bitwise Exclusive OR
~ NOT Unary complement (bit inversion)
<< SHL Shift Left
>> SHR Shift Right

Precedence of Operators in C++

When writing complex expressions with several operands, we may have some doubts about which operand is
evaluated first and which later. For example, in this expression:
a = 5 + 7 % 2

we may doubt if it really means:
a = 5 + (7 % 2) // with a result of 6, or
a = (5 + 7) % 2 // with a result of 0
The correct answer is the first of the two expressions, with a result of 6. There is an established order with the
priority of each operator, and not only the arithmetic ones (those whose preference come from mathematics) but
for all the operators which can appear in C++. From greatest to lowest priority, the priority order is as follows:
Level Operator Description Grouping
1 :: scope
Left-toright
2
() [] . -> ++ -- dynamic_cast static_cast
reinterpret_cast const_cast typeid postfix
Left-toright
3
++ -- ~ ! sizeof new delete unary (prefix)
Right-toleft
* &
indirection and reference
(pointers)
+ - unary sign operator
4 (type) type casting
Right-toleft
5 .* ->* pointer-to-member
Left-toright
6 * / % multiplicative
Left-toright
7 + - additive
Left-toright
8 << >> shift
Left-toright
9 < > <= >= relational
Left-toright
10 == != equality
Left-toright
11 & bitwise AND
Left-toright
12 ^ bitwise XOR
Left-toright
13 | bitwise OR
Left-toright
14 && logical AND
Left-toright
15 || logical OR
Left-toright
16 ?: conditional
Right-toleft
17 = *= /= %= += -= >>= <<= &= ^= |= assignment
Right-toleft
18 , comma
Left-toright
Grouping defines the precedence order in which operators are evaluated in the case that there are several
operators of the same level in an expression.
All these precedence levels for operators can be manipulated or become more legible by removing possible
ambiguities using parentheses signs ( and ), as in this example:
a = 5 + 7 % 2;


might be written either as:
a = 5 + (7 % 2);
or
a = (5 + 7) % 2;
depending on the operation that we want to perform.
So if you want to write complicated expressions and you are not completely sure of the precedence levels, always
include parentheses. It will also become a code easier to read.