Chapter 2 - C++ Basics Concise
Chapter 2 - C++ Basics Concise
Page | 1
Assosa University
Department of Computer Science
Here's how cout is used: type the word cout, followed by the output redirection operator (<<). Whatever
follows the output redirection operator is written to the screen. If you want a string of characters written,
be sure to enclose them in double quotes ("), as shown on line 5. A text string is a series of printable
characters.
The final two characters, \n, tell cout to put a new line after the words Hello World! All ANSI-compliant
programs declare main() to return an int. This value is "returned" to the operating system when your
program completes. Some programmers signal an error by returning the value 1.
The main() function ends on line 7 with the closing brace.
Page | 2
Assosa University
Department of Computer Science
Notice that main is not a reserved word. However, this is a fairly technical distinction, and for practical
purposes you are advised to treat main, cin, and cout as if they were reserved as well.
2.4.2. Identifiers
An identifier is name associated with a function or data object and used to refer to that function or data
object. An identifier must:
Start with a letter or underscore
Consist only of letters, the digits 0-9, or the underscore symbol _
Not be a reserved word
Syntax of an identifier
For the purposes of C++ identifiers, the underscore symbol, _, is considered to be a letter. Its use as the
first character in an identifier is not recommended though, because many library functions in C++ use
such identifiers. Similarly, the use of two consecutive underscore symbols, _ _, is forbidden.
The following are valid identifiers
Length days_in_year DataSet1 Profit95
Int _Pressure first_one first_1
Although using _Pressure is not recommended.
The following are invalid:
days-in-year 1data int first.val
Throw my__best No## bestWish!
Although it may be easier to type a program consisting of single character identifiers, modifying or
correcting the program becomes more and more difficult.
The minor typing effort of using meaningful identifiers will repay itself many fold in the avoidance of
simple programming errors when the program is modified.
Page | 3
Assosa University
Department of Computer Science
At this stage it is worth noting that C++ is case-sensitive. That is lower-case letters are treated as distinct
from upper-case letters.
Thus the word NUM different from the word num or the word Num. Identifiers can be used to identify
variable or constants or functions. Function identifier is an identifier that is used to name a function.
2.4.3. Literals
Literals are constant values which can be a number, a character of a string. For example the number
129.005, the character ‘A’ and the string “hello world” are all literals. There is no identifier that identifies
them.
2.4.4. Comments
A comment is a piece of descriptive text which explains some aspect of a program. Program comments
are totally ignored by the compiler and are only intended for human readers. C++ provides two types of
comment delimiters:
Anything after // (until the end of the line on which it appears) is considered a comment.
Anything enclosed by the pair /* and */ is considered a comment.
2.5. Data Types, Variables, and Constants
2.5.1. Variables
A variable is a symbolic name for a memory location in which data can be stored and subsequently
recalled. Variables are used for holding data values so that they can be utilized in various computations in
a program. All variables have two important attributes:
A type, which is, established when the variable is defined (e.g., integer, float, character). Once
defined, the type of a C++ variable cannot be changed.
A value, which can be changed by assigning a new value to the variable. The kind of values a
variable can assume depends on its type. For example, an integer variable can only take integer
values (e.g., 2, 100, -12) not real numbers like 0.123.
Variable Declaration
Declaring a variable means defining (creating) a variable. You create or define a variable by stating its
type, followed by one or more spaces, followed by the variable name and a semicolon. The variable name
can be virtually any combination of letters, but cannot contain spaces and the first character must be a
letter or an underscore. Variable names cannot also be the same as keywords used by C++. Legal variable
names include x, J23qrsnf, and myAge. Good variable names tell you what the variables are for; using
good names makes it easier to understand the flow of your program. The following statement defines an
integer variable called myAge:
int myAge;
IMPORTANT- Variables must be declared before used!
As a general programming practice, avoid such horrific names as J23qrsnf, and restrict single-letter
variable names (such as x or i) to variables that are used only very briefly. Try to use expressive names
such as myAge or howMany.
A point worth mentioning again here is that C++ is case-sensitive. In other words, uppercase and
lowercase letters are considered to be different. A variable named age is different from Age, which is
different from AGE.
Creating More Than One Variable at a Time
You can create more than one variable of the same type in one statement by writing the type and then the
variable names, separated by commas.
For example:
int myAge, myWeight; // two int variables
long area, width, length; // three longs
Page | 4
Assosa University
Department of Computer Science
As you can see, myAge and myWeight are each declared as integer variables. The second line declares
three individual long variables named area, width, and length. However keep in mind that you cannot mix
types in one definition statement.
int Width = 5;
Initialization looks very much like assignment, and with integer variables, the difference is minor. The
essential difference is that initialization takes place at the moment you create the variable.
Just as you can define more than one variable at a time, you can initialize more than one variable at
creation. For example:
// create two int variables and initialize them
int width = 5, length = 7;
This example initializes the integer variable width to the value 5 and the length variable to the value 7. It
is possible to even mix definitions and initializations:
int myAge = 39, yourAge, hisAge = 40;
This example creates three type int variables, and it initializes the first and third.
2.5.2. Basic Data Types
When you define a variable in C++, you must tell the compiler what kind of variable it is: an integer, a
character, and so forth. This information tells the compiler how much room to set aside and what kind of
value you want to store in your variable.
Several data types are built into C++. The varieties of data types allow programmers to select the type
appropriate to the needs of the applications being developed. The data types supported by C++ can be
classified as basic (fundamental) data types, user defined data types, derived data types and empty data
types. However, the discussion here will focus only on the basic data types.
Basic (fundamental) data types in C++ can be conveniently divided into numeric and character types.
Numeric variables can further be divided into integer variables and floating-point variables. Integer
variables will hold only integers whereas floating number variables can accommodate real numbers.
Both the numeric data types offer modifiers that are used to vary the nature of the data to be stored. The
modifiers used can be short, long, signed and unsigned.
The data types used in C++ programs are described in Table 1.1. This table shows the variable type, how
much room it takes in memory, and what kinds of values can be stored in these variables. The values that
can be stored are determined by the size of the variable types.
Data Type Size Range of Values
unsigned short int 2 bytes 0 to 65,535
short int(signed short int) 2 bytes -32,768 to 32,767
unsigned long int 4 bytes 0 to 4,294,967,295
long int(signed long int) 4 bytes -2,147,483,648 to
2,147,483,647
int 2 bytes -32,768 to 32,767
Page | 5
Assosa University
Department of Computer Science
unsigned int 2 bytes 0 to 65,535
signed int 2 bytes -32,768 to 32,767
Char 1 byte 256 character values
Float 4 bytes 3.4e-38 to 3.4e38
Double 8 bytes 1.7e-308 to 1.7e308
long double 10 bytes 1.2e-4932 to 1.2e4932
Table C++ data types and their ranges
Because you have the same number of bytes for both signed and unsigned integers, the largest number
you can store in an unsigned integer is twice as big as the largest positive number you can store in a
signed integer. An unsigned short integer can handle numbers from 0 to 65,535. Half the numbers
represented by a signed short are negative, thus a signed short can only represent numbers from -32,768
to 32,767.
Page | 6
Assosa University
Department of Computer Science
2.5.4. Characters
Character variables (type char) are typically 1 byte, enough to hold 256 values. A char can be interpreted
as a small number (0-255) or as a member of the ASCII set. ASCII stands for the American Standard Code
for Information Interchange. The ASCII character set and its ISO (International Standards Organization)
equivalent are a way to encode all the letters, numerals, and punctuation marks.
In the ASCII code, the lowercase letter "a" is assigned the value 97. All the lower- and uppercase letters,
all the numerals, and all the punctuation marks are assigned values between 1 and 128. Another 128
marks and symbols are reserved for use by the computer maker, although the IBM extended character set
has become something of a standard.
Page | 7
Assosa University
Department of Computer Science
An assignment operation is itself an expression whose value is the value stored in its left operand. An
assignment operation can therefore be used as the right operand of another assignment operation. Any
number of assignments can be concatenated in this fashion to form one expression.
For example:
int m, n, p;
m = n = p = 100; // means: n = (m = (p = 100));
m = (n = p = 100) + 2; // means: m = (n = (p = 100)) + 2;
This is equally applicable to other forms of assignment.
For example:
m = 100;
m += n = p = 10; // means: m = m + (n = p = 10);
Except for remainder (%) all other arithmetic operators can accept a mix of integer and real operands.
Generally, if both operands are integers then the result will be an integer. However, if one or both of the
operands are reals then the result will be a real (or double to be exact).
When both operands of the division operator (/) are integers then the division is performed as an integer
division and not the normal division we are used to. Integer division always results in an integer outcome
(i.e., the result is always rounded down).
For example:
9/2 // gives 4, not 4.5!
-9 / 2 // gives -5, not -4!
Unintended integer divisions are a common source of programming errors. To obtain a real division
when both operands are integers, you should cast one of the operands to be real:
int cost = 100;
int volume = 80;
double unitPrice = cost / (double) volume; // gives 1.25
The remainder operator (%) expects integers for both of its operands. It returns the remainder of
integer-dividing the operands. For example 13%3 is calculated by integer dividing 13 by 3 to give an
outcome of 4 and a remainder of 1; the result is therefore 1.
It is possible for the outcome of an arithmetic operation to be too large for storing in a designated
variable. This situation is called an overflow. The outcome of an overflow is machine-dependent and
therefore undefined. For example:
Page | 8
Assosa University
Department of Computer Science
Paramet
Header Functio er Result
Result
File n Type(s) Type
<stdlib.h> abs(i) int int Absolute value of i
<math.h> cos(x) float float Cosine of x (x is in
radians)
<math.h> fabs(x) float float Absolute value of x
<math.h> pow(x, float float x raised to the power of
y) y
<math.h> sin(x) float float Sine of x (x is in
radians)
<math.h> sqrt(x) float float Square root of x
<math.h> tan(x) float float Tangent of x
unsigned char k = 10 * 92; // overflow: 920 > 255
It is illegal to divide a number by zero. This results in a run-time division-by-zero failure, which typically
causes the program to terminate.
There are also a number of predefined library functions, which perform arithmetic operations. As with
input & output statements, if you want to use these you must put a #include statement at the start of
your program.
Page | 9
Assosa University
Department of Computer Science
>= Greater Than or Equal 6.3 >= 5 // gives 1
Relational operators
Note that the <= and >= operators are only supported in the form shown. In particular, =< and => are
both invalid and do not mean anything.
The operands of a relational operator must evaluate to a number. Characters are valid operands since
they are represented by numeric values. For example (assuming ASCII coding):
'A' < 'F' // gives 1 (is like 65 < 70)
The relational operators should not be used for comparing strings, because this will result in the string
addresses being compared, not the string contents. For example, the expression "HELLO" < "BYE" causes
the address of "HELLO" to be compared to the address of "BYE". As these addresses are determined by
the compiler (in a machine-dependent manner), the outcome may be 0 or 1, and is therefore undefined.
C++ provides library functions (e.g., strcmp) for the lexicographic comparison of string.
2.6.4. Logical Operators
C++ provides three logical operators for combining logical expression. These are summarized in the table
below. Like the relational operators, logical operators evaluate to 1 or 0.
Operator Name Example
! Logical Negation !(5 == 5) // gives 0
&& Logical And 5 < 6 && 6 < 6 // gives 1
|| Logical Or 5 < 6 || 6 < 5 // gives 1
Logical operators
Logical negation is a unary operator, which negates the logical value of its single operand.
If its operand is nonzero it produces 0, and if it is 0 it produces 1.
Logical and produces 0 if one or both of its operands evaluate to 0. Otherwise, it produces 1. Logical or
produces 0 if both of its operands evaluate to 0. Otherwise, it produces 1.
Note that here we talk of zero and nonzero operands (not zero and 1). In general, any nonzero value can
be used to represent the logical true, whereas only zero represents the logical false.
Page | 10
Assosa University
Department of Computer Science
-- Auto Decrement k-- + 10; //
(postfix) gives 15
Increment and decrement operators
Both operators can be used in prefix and postfix form. The difference is significant. When used in prefix form,
the operator is first applied and the outcome is then used in the expression.
When used in the postfix form, the expression is evaluated first and then the operator applied. Both operators
may be applied to integer as well as real variables, although in practice real variables are rarely useful in this
form.
2.7. Precedence of Operators
The order in which operators are evaluated in an expression is significant and is determined by precedence
rules. These rules divide the C++ operators into a number of precedence levels. Operators in higher levels take
precedence over operators in lower levels.
For example, in
a == b + c * d
c * d is evaluated first because * has a higher precedence than + and ==. The result is then added to b because
+ has a higher precedence than ==, and then == is evaluated. Precedence rules can be overridden using
brackets. For example, rewriting the above expression as a == (b + c) * d that causes + to be evaluated before *.
Operators with the same precedence level are evaluated in the order specified by the last column of Table 2.7.
For example, in
a = b += c
the evaluation order is right to left, so first b += c is evaluated, followed by a = b.
2.8. Simple Type Conversion
A value in any of the built-in types we have see so far can be converted (type-cast) to any of the other types.
For example:
(int) 3.14 // converts 3.14 to an int to give 3
(long) 3.14 // converts 3.14 to a long to give 3L
(double) 2 // converts 2 to a double to give 2.0
Page | 11
Assosa University
Department of Computer Science
(char) 122 // converts 122 to a char whose code is 122
(unsigned short) 3.14 // gives 3 as an unsigned short
As shown by these examples, the built-in type identifiers can be used as type operators. Type operators are
unary (i.e., take one operand) and appear inside brackets to the left of their operand. This is called explicit
type conversion. When the type name is just one word, an alternate notation may be used in which the
brackets appear around the operand:
In some cases, C++ also performs implicit type conversion. This happens when values of different types are
mixed in an expression.
For example:
double d = 1; // d receives 1.0
int i = 10.5; // i receives 10
i = i + d; // means: i = int(double(i) + d)
In the last example, i + d involves mismatching types, so i is first converted to double (promoted) and then
added to d.
The result is a double which does not match the type of i on the left side of the assignment, so it is converted to
int (demoted) before being assigned to i.
The above rules represent some simple but common cases for type conversion.
2.9. Statements
This chapter introduces the various forms of C++ statements for composing programs.
Statements represent the lowest-level building blocks of a program. Roughly speaking, each statement
represents a computational step which has a certain side-effect.
(A side-effect can be thought of as a change in the program state, such as the value of a variable changing
because of an assignment.) Statements are useful because of the side-effects they cause, the combination of
which enables the program to serve a specific purpose (e.g., sort a list of names).
A running program spends all of its time executing statements. The order in which statements are executed is
called flow control (or control flow). This term reflect the fact that the currently executing statement has the
control of the CPU, which when completed will be handed over (flow) to another statement.
Flow control in a program is typically sequential, from one statement to the next, but may be diverted to other
paths by branch statements. Flow control is an important consideration because it determines what is
executed during a run and what is not, therefore affecting the overall outcome of the program.
Like many other procedural languages, C++ provides different forms of statements for different purposes.
Declaration statements are used for defining variables.
Assignment-like statements are used for simple, algebraic computations. Branching statements are used for
specifying alternate paths of execution, depending on the outcome of a logical condition.
Loop statements are used for specifying computations which need to be repeated until a certain logical
condition is satisfied. Flow control statements are used to divert the execution path to another part of the
program. We will discuss these in turn.
2.9.1. Input/Output Statements
The most common way in which a program communicates with the outside world is through simple,
character-oriented Input/Output (IO) operations. C++ provides two useful operators for this purpose: >> for
input and << for output. We have already seen examples of output using <<. Example 2.1 also illustrates the
use of >> for input.
Page | 12
Assosa University
Department of Computer Science
Example
#include <iostream.h>
int main (void)
{
int workDays = 5;
float workHours = 7.5;
float payRate, weeklyPay;
Both << and >> return their left operand as their result, enabling multiple input or multiple output operations
to be combined into one statement. This is illustrated by example below which now allows the input of both
the daily work hours and the hourly pay rate
Example
#include <iostream.h>
int main (void)
{
int workDays = 5;
float workHours, payRate, weeklyPay;
cout << "What are the work hours and the hourly pay rate? ";
cin >> workHours >> payRate;
Analysis
This line reads two input values typed by the user and copies them to workHours and payRate, respectively. The two values
should be separated by white space (i.e., one or more space or tab characters). This statement is equivalent to:
(cin >> workHours) >> payRate;
Because the result of >> is its left operand, (cin >> workHours) evaluates to cin which is then used as the left operand of the
next >> operator.
Page | 13
Assosa University
Department of Computer Science
This line is the result of combining lines 10-12 from example 2.1. It outputs "Weekly Pay = ", followed by the value of
weeklyPay, followed by a newline character. This statement is equivalent to:
((cout << "Weekly Pay = ") << weeklyPay) << '\n';
Because the result of << is its left operand, (cout << "Weekly Pay = ") evaluates to cout which is then used as the left operand
of the next << operator, etc.
Any place you can put a single statement, you can put a compound statement, also called a block. A block begins with an
opening brace ({) and ends with a closing brace (}). Although every statement in the block must end with a semicolon, the
block itself does not end with a semicolon.
For example
{
temp = a;
a = b;
b = temp;
}
This block of code acts as one statement and swaps the values in the variables a and b.
Page | 14