Variables: Named Storage Locations Variables must be defined or declared before they can be used so that appropriate memory storage can be allocated for them. Examples of declaration (or definition) statements int number_of_tests; float test_average; int grade_test1, grade_test2, grade_test3; char letter_grade; Assigning Values to Variables • = is the assignment operator o number_of_tests = 3; o letter_grade = ‘B’; o test_average = 88.56; • Type of literal assigned should match the type declaration/definition of the variable • If a floating point value is assigned to a variable of type ‘int’ only the integer part will be stored (fractional part is truncated NOT rounded) • Care should be taken to not exceed the maximum storage value of the data type Note: Until an assignment statement is executed, the contents of the storage area for a variable are garbage (unpredictable)! Initializing Variables in the Definition When a variable is declared (defined), it can also be initialized with an assignment statement. You can also initialize it with an assignment statement that is not part of the declaration. Both examples below accomplish the same task. However, when possible, it is best to initialize a variable as close to where it is used in the source code. This practice is a matter of style and will be required in this course. Examples: int number_of_tests = 3; or int number_of_tests; number_of_tests = 3: Arithmetic Operators Arithmetic expressions can be used in assignment statements. Below is a table of the arithmetic operators we will be using: Operator Functionality Example + addition final_price = tag_price + sales_tax - subtraction discount_price = tag_price – coupon_discount * multiplication sales_tax = tag_price * tax_rate / division test_average = sum_of_tests/number_of_tests % modulus remainder = number % 2 - negation x = -y Evaluating Arithmetic Expressions Precedence • • • • • Evaluate left to right (except unary negation) () contents of parenthesis are evaluated first - when used as unary negation is next *, / and % are then next in order of appearance + and – are last (the – here is the binary subtraction operator) Examples: 4 + 3 * 2 = 10 (4 + 3) * 2 = 14 6+8%3=8 Exponents C++ has no exponent operators so a library function is required. A library in C++ and other languages is a group of predefined functions that perform usually common tasks. If you need to raise a value to the 5th power you could write: value_raised = value * value * value * value * value; Imagine doing this to raise a number to the 20th or even a higher power. Instead we use the pow(number, exponent) function. number and exponent are called arguments. value_raised = pow(value,5.0); Note: To use any predefined C++ mathematical function you must include the cmath header file. #include <cmath> More on Assignment Multiple Assignment: Assign the same value to several variables in a single assignment statement (Do not use this feature in this class!) Example: The statements below initializes all 3 variables to zero int number1, number2, number3; number1 = number2 = number3 = 0; Combined Assignment: The variable name can appear on BOTH sides of the assignment operator. NOTE: The variable must have a valid value BEFORE this kind of assignment statement is used. Example: The statement below increments the number by 2 int number = 2; number = number + 2; Note: The resulting value stored in memory for number is now 4 These two kinds of assignment statements are very common in programming. However, as beginners, we will not use multiple assignment in this class. Combined Assignment Operators Special operators are available in C++ to be used for combined assignment statements. In the examples below we will assume that Number has been initialized to 10 Operator += -= *= /= %= Example number += 2; number -= 2; number *= 2; number /= 2; number %= 2; Resulting Value of Number 12 8 20 5 0 Mixing Data Types in Arithmetic Expressions • Data Type Ranking – A data type out ranks another data type if it can hold a larger number o long double > double > float > unsigned long > long > unsigned int > int o Exception: if int and long are same size then unsigned int > long • char, shorts and unsigned shorts used in mathematical expressions are promoted to int o Exception: if short is same size as int then unsigned short is promoted to unsigned int • When an operator is used with two values of differing types then the lower ranking type is promoted to the same type as the higher ranking type • When the result of an expression evaluation is assigned to a variable it will be converted to the type of the variable Integer Division If both operands of a division statement are integers the result will be an integer with any fractional component being discarded. In an expression the literal 18 is an integer but 18.0 is a floating point number. Be VERY careful and mindful when using mixed mode arithmetic. Overflow and Underflow Based on the storage size of data types in any particular system there is a fixed range of values that can be stored in a variable of a give data types. Overflow: The assignment of a value LARGER than the storage capacity of the data type of the variable can hold Underflow: The assignment of a value SMALLER than the storage capacity of the data type of the variable can hold This is a danger when working at the limits of a data type’s storage capacity. Type Casting: Control Type Promotion Manually static_cast<data type>(value) For example: Type casting can be used to avoid integer division int test1, test2, test3, test_sum; float test_average; … (input values for the three tests) test_sum = test1 + test2 + test3; test_average = static_cast<float>(test_sum) / 3; Watch Out! int float test1, test2; avg; test1 = 100; test2 = 83; //What value does avg have after each of these //assignment statements are executed? avg = test1 + test2 / 2; avg = (test1 + test2) / 2; avg = static_cast<float>(test1 + test2) / 2; avg = static_cast<float>((test1 + test2) / 2); avg = (test1 + test2) / 2.0; Expression Evaluation Practice