Managed C++ Operators |
|
An operation is an action performed on one or more variables either to modify the value held by one or both of the variables or to produce a new value by combining variables. Therefore, an operation is performed using at least one symbol and one variable. The symbol used in an operation is called an operator. A variable or a value involved in an operation is called an operand.
Algebra uses a type of ruler to classify numbers. This ruler has a middle position of zero. The numbers on the left side of the 0 are considered negative while the numbers on the right side of the rulers are considered positive:
A value on the right side of 0 is considered positive. To express that a number is positive, you can write a + sign on its left. Examples are +4, +228, +90335. In this case the + symbol is called a unary operator because it acts on only one operand. The positive unary operator, when used, must be positioned on the left side of its operand.
This would produce:
As you can see on the above ruler, in order to express any number on the left side of 0, it must be appended with a sign, namely the - symbol. Examples are -12, -448, -32706. A value accompanied by - is referred to as negative.
This would produce:
In algebra, operations are performed on numeric values:
The addition is an operation used to add one number to another. For example, if you have one pen and somebody gives you another pen, then you have two pens. If you keep receiving pens, you will soon have more than you had originally. In this manner, as you add pens, the number grows. The addition gives you to ability to add things of the same nature one to another, as many as necessary, until all items have been added. Sometimes, the items are added one group to another. The concept is still the same, except that this last example is faster. For example, if you have a group of eleven students and you add 5 students to the group, you can apply the same rule by adding one student at a time. But to perform this operation faster, you should work to add groups of items to one another. The addition is performed in mathematics using the + sign. The same sign is used in C++. The + sign is located on the left side of the Backspace key. You get it by pressing Shift and =. To get the addition of two values, you add the first one to the other. After the addition of two values has been performed, you get a new value. This means if you add Value1 to Value2, you would write Value1 + Value2. The result is another value we could call Value3. You can also add more than two values, like a + b + c. The order you use to add two or more values doesn't matter. This means Value1 + Value2 is the same as Value2 + Value1. In the same way a + b + c is the same as a + c + b the same as b + a + c and the same as c + b + a In C++, you can add values you know already, or you can use values the program gets from the user. The simplest way to add values in C++ is by performing a simple sum. Here is an example:
Here is the result: 68 + 478 = 546 Press any key to continue... You can also add some values already declared and initialized in your program. Here is an example: // This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { int a = 68; int b = 478; // Get the sum of a and b Console::Write(a); Console::Write(" + "); Console::Write(b); Console::Write(" = "); Console::WriteLine(a + b); Console::WriteLine(); return 0; } This would produce: 68 + 478 = 546 Press any key to continue...
The subtraction operation is used to take out or subtract a value from another value. It is essentially the opposite of the addition. The subtraction in C++ is performed with the - sign, which is between the 0 and the = keys. Here is an example: // This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { Console::Write("68 - 478 = "); Console::WriteLine(68 - 478); Console::WriteLine(); return 0; } This would produce: 68 - 478 = -410 Press any key to continue Unlike the addition, the subtraction is not associative. This means a - b - c is not the same as c - b - a. This is illustrated in the following program: // This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { // Addition associativity Console::Write("128 + 42 + 5 = "); Console::WriteLine(128 + 42 + 5); Console::Write(" 5 + 42 + 128 = "); Console::WriteLine(5 + 42 + 128); // Subtraction's non-associativity Console::Write("\n128 - 42 - 5 = "); Console::WriteLine(128 - 42 - 5); Console::Write(" 5 - 42 - 128 = "); Console::WriteLine(5 - 42 - 128); Console::WriteLine(); return 0; } This would produce: 128 + 42 + 5 = 175 5 + 42 + 128 = 175 128 - 42 - 5 = 81 5 - 42 - 128 = -165 Press any key to continue... Notice that both operations of the addition produce the same result. In the subtraction section, the numbers follow the same order but a different operation; and the last two operations render different results.
The multiplication allows adding one value to itself a certain number of times, set by a second value. As an example, instead of adding a value to itself in this manner: a + a + a + a, since the variable a is repeated over and over again, you could simply find out how many times a is added to itself, then multiply a by that number which, is this case, is 4. This would mean adding a to itself 4 times, and you would get the same result. The multiplication is performed with the * sign which is typed with Shift + 8. Here is an example: // This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { Console::Write("68 * 478 = "); Console::WriteLine(68 * 478); Console::WriteLine(); return 0; } This would produce: 68 * 478 = 32504 Press any key to continue Like the addition, the multiplication is associative: a * b * c = c * b * a. When it comes to programming syntax, the rules we learned with the addition operation also apply to the multiplication.
Dividing an item means cutting it in pieces or fractions of a set value. For example, when you cut an apple in the middle, you are dividing it in 2 pieces. If you cut each one of the resulting pieces, you will get 4 pieces or fractions. This is considered that you have divided the apple in 4 parts. Therefore, the division is used to get the fraction of one number in terms of another. The division is performed with the forward slash /. When performing the division, be aware of its many rules. Never divide by zero (0). Make sure that you know the relationship(s) between the numbers involved in the operation. Here is an example: // This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { double a = 68, b = 478; double c; c = a / b; Console::Write("68 / 478 = "); Console::WriteLine(c); Console::WriteLine(); return 0; } Here is an example of running the program: 68 / 478 = 0.142259414225941 Press any key to continue
The division program above will give you a result of a number with decimal values if you type an odd number (like 147), which is fine in some circumstances. Sometimes you will want to get the value remaining after a division renders a natural result. Imagine you have 26 kids at a football (soccer) stadium and they are about to start. You know that you need 11 kids for each team to start. If the game starts with the right amount of players, how many will seat and wait? The remainder operation is performed with the percent sign (%) which is gotten from pressing Shift + 5. Here is an example: // This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { int a = 68, b = 478; int c; c = b % a; Console::Write("478 % 68 = "); Console::WriteLine(c); Console::WriteLine(); return 0; } Here is an example of running the program: 478 % 68 = 2 Press any key to continue
As a language, C++ is equipped with non-algebraic operators intended to perform specific operations. We will review some of these operators now; some others need intermediary concepts that we haven't studied and cannot study at this time.
A single, represented by ', is used to include a value of a char type. As such, it can be used to initialize a variable. The single-quote is always accompanied by another. This means that, unless specified otherwise, single-quotes always come as a pair.
A double-quote, represented by ", is used to include a string. It can be used to initialize a String variable. It is also heavily used in functions such as Write or WriteLine as we have seen so far. Unless specified otherwise, double-quotes always come as a pair.
Like most computer languages, C++ uses parentheses to isolate a group of items that must be considered as belonging to one entity. For example, as we will learn soon, parentheses allow a function to delimit the list of its arguments. Unless specified otherwise, parentheses always come as a pair. Parentheses can also be used to isolate an operation or an expression with regard to another operation or expression. For example, when studying the algebraic operations, we saw that the subtraction is not associative and can lead to unpredictible results. In the same way, if your operation involves various operators such as addition(s) and subtraction(s), you can use parentheses to tell the compiler how to proceed with the operations, that is, what operation should (must) be performed first. Consider the following algebraic operation: 154 - 12 + 8 The question here is to know whether you want to subtract the addition of 12 and 8 from 154 or you want to add the difference between 154 and 12 to 8. Using parentheses, you can communicate your intentions to the compiler. This is illustrated in the following program: #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { Console::Write("(154 - 12) + 8 = "); Console::WriteLine((154 - 12) + 8); Console::Write(" 154 - (12 + 8) = "); Console::WriteLine(154 - (12 + 8)); Console::WriteLine(); return 0; } This would produce: (154 - 12) + 8 = 150 154 - (12 + 8) = 134 Press any key to continue... As you can see, using the parentheses controls how the whole operation would proceeds This difference can be even more accentuated if your operation includes 3 or more operators and 4 or more operands.
As we will learn in our lessons, many of the variables we will use in our Managed C++ expect a specific type of value. For example, most of the values we will use in Managed C++ are called managed objects, as opposed to regular types, also called value types, that we have used so far. For example, Write and WriteLine that we have used so far expect a specific type of value. To convert a regular type to this type of value, Managed C++ provides a unary operator called __box. This operator uses parentheses in which you type the value that needs to be converted. You can convert a value using the __box operator in order to properly display it in Write or WriteLine. Here is an example: // This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { double salary = 12.84; Console::Write("Salary: "); Console::WriteLine(__box(salary)); Console::WriteLine(); return 0; } This would produce: Salary: 12.84 Press any key to continue
Curly brackets are probably the most used and the most tolerant operators of C++. Fundamentally, curly brackets are used to create or isolate sections of code. As such they are required to delimit the bodies of functions, classes, structures, exceptions, and namespaces. They are also optionally used in conditional statements. We will view all these uses of square brackets in this book. Curly brackets are also used to create variable scope. Unless specified otherwise, curly brackets always come as a pair. Curly brackets can also be used to create an explicit section in a program as you see fit. Here is an example: // This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { double salary = 12.84; { Console::Write("Salary: "); Console::WriteLine(__box(salary)); } Console::WriteLine(); return 0; } The __box operator can also be used in combination with the curly brackets in Write or WriteLine to display a regular value. To use this technique, in the parentheses of Write or WriteLine, type an opening and a closing curly bracket. In the parentheses, type an incremental number starting at 0. If you have only one value to display, type 0. After typing the curly brackets completing the string, type a comma followed by the value to display using the __box operator. Here is an example: // This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { double salary = 12.84; Console::Write("Salary: {0}", __box(salary)); Console::WriteLine(); return 0; } You can also use this technique to display more than one value using a single Write or WriteLine. To do that, type each incremental in in its own curly brackets. The first number will have a number of 0; the second will be 1, etc. After closing the string and typing the comma, type each boxed value and separate them with commas. Here is an example: // This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { double weeklyHours = 35.50; double hourlySalary = 12.84; Console::Write("Weekly Hours = {0}, Hourly Salary = {1}", __box(weeklyHours), __box(hourlySalary)); Console::WriteLine(); return 0; } This would produce: Weekly Hours = 35.5, Hourly Salary = 12.84 Press any key to continue
A colon is used to signal an object whose information will
be used or will be needed somewhere later on. There are various circumstances in
which you would use a colon and they don't always follow the same rule. As an
example, the color can be used to format how a boxed value would be displayed.
To the colon in this case, after typing the incremental value in the curly
brackets, type a colon, followed by one of the following characters:
Here are examples: // This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { int gender = 1; double weeklyHours = 35.50; double hourlySalary = 12.84; double distance = 1455.2816; long color = 7329457; Console::WriteLine("Gender: {0:N}", __box(gender)); Console::WriteLine("Weekly Hours: {0:F}", __box(weeklyHours)); Console::WriteLine("Hourly Salary: {0:C}", __box(hourlySalary)); Console::WriteLine("Distance: {0:E}", __box(distance)); Console::WriteLine("Color: 0x{0:X}", __box(color)); Console::WriteLine(); return 0; } This would produce: Gender: 1.00 Weekly Hours: 35.50 Hourly Salary: $12.84 Distance: 1.455282E+003 Color: 0x6FD6B1 Press any key to continue
Square brackets are mostly used to control the dimension or index of an array. We will learn how to use them when we study arrays.
A reference is a variable name that is a duplicate of an existing variable. It provides a technique of creating more than one name to designate the same variable. To declare a reference variable, you use the reference operator expressed with the ampersand. The syntax of creating or declaring a reference is: DataType &RefernceName = VariableName; To declare a reference, type the variable’s name preceded by the same type as the variable it is referring to. Between the data type and the reference name, type the ampersand operator “&”. To specify what variable the reference is addressed to, use the assignment operator “=” followed by the name of the variable. The referred to variable must exist already. You cannot declare a reference as: int &Mine; The compiler wants to know what variable you are referring to. Here is an example:
The ampersand operator between the data type and the reference can assume one of three positions as follows: int& Nbr; int & Nbr; int &Nbr; As long as the & symbol is between a valid data type and a variable name, the compiler knows that the variable name (in this case Nbr) is a reference. Once a reference has been initialized, it holds the same value as the variable it is pointing to. You can then display the value of the variable using either of both: // This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { int Number = 228; int & Nbr = Number; Console::Write("Number = "); Console::WriteLine(Number); Console::Write("Its reference = "); Console::WriteLine(Nbr); Console::WriteLine(); return 0; } This would produce: Number = 228 Its reference = 228 Press any key to continue If you change the value of the variable, the compiler updates the value of the reference so that both variables would hold the same value. In the same way, you can modify the value of the reference, which would update the value of the referred to variable. To access the reference, do not use the ampersand operator; just the name of the reference is sufficient to the compiler. This is illustrated in the following: // This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { int Number = 228; // Regular variable int& Nbr = Number; // Reference Console::Write("Number = "); Console::WriteLine(Number); Console::Write("Its reference = "); Console::WriteLine(Nbr); // Changing the value of the original variable Number = 4250; Console::Write("\nNumber = "); Console::WriteLine(Number); Console::Write("Its reference = "); Console::WriteLine(Nbr); // Modifying the value of the reference Nbr = 38570; Console::Write("\nNumber = "); Console::WriteLine(Number); Console::Write("Its reference = "); Console::WriteLine(Nbr); Console::WriteLine(); return 0; } This would produce: Number = 228 Its reference = 228 Number = 4250 Its reference = 4250 Number = 38570 Its reference = 38570 Press any key to continue... In the same way, you can use either a reference or the variable it is referring to, to request the variable’s value from the user.
We have already seen that when declaring a variable, the compiler reserves a portion of memory in the computer memory to hold that variable. We also reviewd how much space some data types need to store their variable. C++ provides the unary sizeof operator that allows you to find out how much space a data type or a certain variable in your program is using. There are two methods you can use with the sizeof operator: using the variable or the data type. The general syntaxes of the sizeof operator are: sizeof VariableName; sizeof DataType; sizeof(VariableName); sizeof(DataType); Any of these two formulas is admissible. But it is good to refrain from using the data type except in rare cases that you can justify. The reason you should apply the sizeof operator on the variable is because, if you change the variable (the word “variable” means it can change throughout the program), that is, if you perform any operation on it, the sizeof operator will acknowledge that and render the right result. Some and most of the time, if you apply the sizeof operator on the data type, you might end up with a bug; if you are lucky, the program would simply not compile. Here is an example: // This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { double Period = 155.50; int SizeOf = sizeof Period; Console::Write("The size of Period is "); Console::Write(SizeOf); Console::WriteLine(" bytes"); Console::WriteLine(); return 0; } This would produce: The size of Period is 8 bytes Press any key to continue...
We are used to counting numbers such as 1, 2, 3, 4, etc. In reality, when counting such numbers, we are simply adding 1 to a number in order to get the next number in the range. C++ provides a technique of transparently counting such numbers. The simplest technique of incrementing a value consists of adding 1 to a variable. After adding 1, the value or the variable is (permanently) modify and the variable would hold the new value. This is illustrated in the following example:
This would produce: Value = 12 Value = 13 Press any key to continue C++ provides a special operator that takes care of this operation. The operator is called the increment operator and is ++. Instead of writing Value = Value + 1, you can write Value++ and you would get the same result. The above program can be re-written as follows:
This would produce: Value = 12 Value = 13 Press any key to continue The increment++ is called a unary operator because it operates on only one variable. It is used to modify the value of the variable by adding 1 to it. Every time the Value++ is executed, the compiler takes the previous value of the variable and adds 1 to it and the variable holds the incremented value:
This would produce: Value = 12 Value = 13 Value = 14 Value = 15 Press any key to continue
When using the ++ operator, the position of the operator with regard to the variable it is modifying can be significant. To increment the value of the variable before re-using it, you should position the operator on the left of the variable:
This would produce: Value = 12 Value = 13 Value = 13 Press any key to continue When writing ++Value, the value of the variable is incremented before being called. On the other hand, if you want to first use a variable, then increment it, in other words, if you want to increment the variable after calling it, position the ++ operator on the right side of the variable:
This would produce: Value = 12 Value = 12 Value = 13 Press any key to continue
When counting numbers backward, such 8, 7, 6, 5, etc, we are in fact subtracting 1 from a value in order to get the lesser value. This operation is referred to as decrementing a variable. This operation works as if a variable called Value has its value diminished by 1, as in Value = Value – 1:
This would produce: Value = 8 Value = 7 Press any key to continue As done with the increment, C++ provides a quicker way of subtracting 1 from a variable. This is done using the decrement operation, that is --. To use the decrement operator, type – on the left or the right side of the variable when this operation is desired. Using the decrement operator, the above program could be written:
This would produce: Value = 8 Value = 7 Press any key to continue Once again, the position of the operator is important. If you want to decrement the variable before calling it, position the operator on the left side of the operator. This is illustrated in the following program:
This would produce: Value = 8 Value = 7 Value = 7 Press any key to continue If you plan to decrement a variable only after it has been accessed, position the operator on the right side of the variable. Here is an example:
This would produce: Value = 8 Value = 8 Value = 7 Press any key to continue
It is not unusual to add or subtract a constant value to or from a variable. All you have to do is to declare another variable that would hold the new value. Here is an example:
This would produce: Value = 12.75 Value = 15.17 Press any key to continue The above technique requires that you use an extra variable in your application. The advantage is that each value can hold its own value although the value of the second value depends to whatever would happen to the original or source variable. Sometimes in your program you will not need to keep the value of the source variable. You might want to simply permanently modify the value that a variable is holding. In this case you can perform the addition operation directly on the variable by adding the desired value to the variable. This operation modifies whatever value a variable is holding and does not need an additional variable. To add a value to a variable and change the value that the variable is holding, use the assignment “=” and the addition “+” operators as follows:
To diminish the value of a variable, instead of the addition operation, use the subtraction and apply the same technique. In the above program, the variable can have its value decremented by applying the assignment and the subtraction operations on the variable as follows:
This would produce: Value = 12.75 Value = 7.39 Press any key to continue
This would produce: 187 & 242 = 178 Press any key to continue
This would produce: 187 | 242 = 251 Press any key to continue...
187 ^ 242 = 73 Press any key to continue...
This would produce: 42 << 2 = 168 Press any key to continue
This would produce: The integer 65 converted to a character is 65 The character 114 converted to an integer is 114 The long integer 241 converted to a character is -15 The float value 2.06 converted to an integer is 2 The double value 122.448 converted to a character is 122 The long integer 241 + the integer 65 converted to an integer is 306 The long integer 241 + the integer 65 converted to a character is 50 The integer 65 + the character 114 converted to an integer is -77 The integer 65 + the character 114 converted to a character is -77 The integer 65 * the character 114 converted to an integer is 13959.072 The double 122.448 / the character 114 converted to an integer is 1 The double 122.448 + the long integer 241 converted to an integer is 363 Press any key to continue
The C++ language provides a new operator to cast the value of a certain data type to another desired and more appropriate data type. This technique can be used to perform the same casting above. This operator is called static_cast. Its syntax is: static_cast<DesiredType>(Expression) The static_cast keyword is required to let the compiler know that you want to perform a variable casting. The DesiredType parameter must be a known type such as the data types we have used so far: integers, char, float, or double. It can be a reference. It can also be an enumerator. In future lessons, we will also learn that it can be a pointer or a class type. The DesiredType must be enclosed between < and > The Expression parameter can be a value to cast. It can also be an operation or a complex expression. Here are examples: // This is the main project file for VC++ application project // generated using an Application Wizard. #include "stdafx.h" #using <mscorlib.dll> using namespace System; int _tmain() { enum TAnimalGender { sgMale, sgFemale, sgHermaphrodite, sgUnknown }; int i, iInt, iDouble, dConvert, iChar, iConvert, iPI; int Gender; char a; float f; double d, dDouble; // Some values to use i = 65; a = 'r'; f = 2.06; d = 122.448; iPI = static_cast<int>(3.14159); iConvert = static_cast<int>(f); dConvert = static_cast<int>(d); iChar = static_cast<int>(i + a); dDouble = static_cast<double>(i * a); iDouble = static_cast<int>(d / a); Gender = static_cast<TAnimalGender>(sgHermaphrodite); Console::WriteLine("Variable Casting"); Console::Write(3.14159); Console::Write(" converted to an integer is "); Console::WriteLine(iPI); Console::Write("The float value "); Console::Write(f); Console::Write(" converted to an integer is "); Console::WriteLine(iConvert); Console::Write("The double value "); Console::Write(d); Console::Write(" converted to an integer is "); Console::WriteLine(dConvert); Console::Write("The integer "); Console::Write(i); Console::Write(" + the character "); Console::Write(a); Console::Write(" converted to an integer is "); Console::WriteLine(iChar); Console::Write("The integer "); Console::Write(i); Console::Write(" * the character "); Console::Write(a); Console::Write(" converted to a double is "); Console::WriteLine(dDouble); Console::Write("The double "); Console::Write(d); Console::Write(" / the character "); Console::Write(a); Console::Write(" converted to an integer is "); Console::WriteLine(iDouble); Console::Write("sgHermaphrodite of the TAnimalGender "); Console::Write("enumerator being cast to an integer is "); Console::WriteLine(Gender); Console::WriteLine(); return 0; } This would produce: Variable Casting 3.14159 converted to an integer is 3 The float value 2.06 converted to an integer is 2 The double value 122.448 converted to an integer is 122 The integer 65 + the character 114 converted to an integer is 179 The integer 65 * the character 114 converted to a double is 7410 The double 122.448 / the character 114 converted to an integer is 1 sgHermaphrodite of the TAnimalGender enumerator being cast to an integer is 2 Press any key to continue
When combining operations in C++, there are two aspects involved: an operator's precedence and its direction. If you ask a program to add two numbers, for example 240 + 65, the program will execute the operation by adding 240 to 65; in other words, it would read 240, then +, then 65, and evaluate the result. This is considered as operating from left to right: 240 -> + -> 65. On the other hand, if you ask the program to find the size of a variable, you would write sizeof(FirstName). In this case, the program would first consider the FirstName variable, then it would evaluate the size of that variable; in other words, it first finds out the variable it is operating on, in this case FirstName. Once it knows the variable that is involved, it would execute the operation. This is considered that the operation is executed from right to left. This process is referred to as the direction of the operation. As you will regularly combine operators on your various calculations, each operation is known for the amount "weighs" as compared to other operators. This is known as its precedence. This means that when a certain operator is combined with another, such as a + b * c, or x / y - z, some operators would execute before others, almost regardless of how you write the operation. That's why an operator could be categorized by its level of precedence. |
|
||
Previous | Copyright © 2004-2010 FunctionX, Inc. | Next |
|