Title: Operations
1Operations
Chapter 4Section 5.2
1
2Expressions
- As we've seen, in a C program, any finite
sequence of objects and operations that combine
to produce a value is called an expression. - A temperature conversion example
- fahrenheit 1.8 celsius 32
- We now consider C operations.
2
3Numeric Expressions
- C provides four familiar arithmetic operators
- for performing addition
- - for performing subtraction
- for performing multiplication
- / for performing division
- Each can be applied to either real (double) or
integer (int) or character (char) operands.
C provides more than 50operations (See
Appendix C)
3
mult. symbols ltlt. , words ((sizeof)
4Division
However, / behaves differently for int than for
double operands
1.8
9.0 / 5 9 / 5.0
9.0 / 5.0 9 / 5
1.8
1
1.8
Type of Operands Kind of Division Performed
real
double
integer
int
Integer division calculates the quotient, but it
also calculates the remainder. To find it we can
use the modulus operator for example, 9 5
.
4
4
guzinta b aq r
5Keep in mind for Project 3
5
4
0
0
6
56
2
1
What about mixed-mode (i.e., mixed-type)
expressions? Automatic Type Conversion (p. 73)
Promotion "Narrower" types (fewer storage bits)
"widened"e.g., int double 9.0/5
9.0/5.0 Explicit Type Conversion (p. 73-4) Type
CastingUse type name to convert an
expression double(intVal) or (double)intVal
Cast Notation
Functional Notation
5
b aq r Assign 3 chang maker double(a) /
double(b)
6Numeric Functions
- The library ltcmathgt contains a variety of
mathematical functions, including - sin(x) asin(x)
- cos(x) acos(x)
- tan(x) atan(x)
- sqrt(x) abs(x)
- exp(x) pow(x, y)
- log(x) floor(x)
- log10(x) ceil(x)
See Appendix Dfor other mathfunctions andother
libraries.
Hyperbolic functions cosh(x), sinh(x),
tanh(x)
6
sqrt(lt0) nan -1.IND pow(x, 1/3) efficiency
Asgn 2 quadratic
7Using ltcmathgt functions
include ltiostreamgt include ltcmathgt using
namespace std
C libraries whose namesstart with 'c' are C
libraries.Their C-names do not havethe 'c' but
have .h appended e.g., ltmath.hgt
- int main()
-
- cout ltlt "\nEnter base and exponent "
- double base, exponent
- cin gtgt base gtgt exponent
- double result pow(base, exponent)
- cout ltlt base ltlt " raised to the power "
- ltlt exponent ltlt " is " ltlt result ltlt endl
Essentiallysame as '\n'
7
8Precedence ( or priority)
- Issue Is the value of the expression 2 3
4(2 3) 4 24 or 2 (3 4) 14 ? - Operator precedence governs evaluation order.
- has higher precedence than , so it is applied
first, making the answer 14.
8
See Slide32
int a 8, b 4, c 2 pow(a, 2) b c -gt
72 a/bc -gt 4 a/(bc_ -gt 1
9Associativity
- Does the expression 8 - 4 - 2evaluate (8 -
4) - 2 2 or 8 - (4 - 2) 6 ? - Precedence doesnt help us.
- Associativity does. Since - is
left-associative, the left - is evaluated first.
Most of the C operators that we use associate
left. See Appendix C for a complete list.
9
See App. D
int a 8, b 4, c 2 a b c a / bc
10Assignment
Assignment is one operator that is
right-associative, which allows expressions
like int w, x, y, z w x y z 0
- The rightmost is applied first, assigning z
zero, - then y is assigned the value of z (0),
then x is assigned the value of y (0), and
finally w is assigned the value of x (0).
( )
( )
( )
w x y z 0
Mixed-mode assignments convert the value to type
of variable and assign it.
10
double pi 3.1416 int w pi 3 pi w
3.0 y 2(x a b) c
11Assignment Shortcuts
- Certain assignments are very common
- var var x // add x to var
- var var - y // sub y from var
- C provides shortcuts for them
- // add x to var
- // sub y from var
Watchout!
var x var - y
11
x 2 x 2 Dont use?
12In General
- Most arithmetic expressions of the form
- var var D value
- can be written in the "shortcut" form
- var D value
- Examples
- double x, y
- cin gtgt x gtgt y
- // double xs value
- // decrease y by half
x 2.0 y / 2.0
12
13Increment and Decrement
- Other common assignments include
- var var 1 // add 1 to var
- var var - 1 // sub 1 from var
- so C provides shortcuts for them, too
- // add 1 to var
- // sub 1 from var
Integer variables only!
13
14Prefix vs. Postfix
?
- As long as the increment (or decrement) operator
is used as a separate statement - int y 0, x 0
- . . .
- x // x becomes
- y // y becomes
- it makes no difference which version is used.
1
1
14
15- However, and -- can be used withinother
expressions then it does make a difference
whether it is prefix or postfix. - The prefix form of increment produces the final
(incremented) value as its result - int x, y 0
- x 2 (y)
- cout ltlt x ltlt " " ltlt y //
- The prefix decrement -- behaves similarly.
2 1 is displayed
15
16- The postfix form of increment produces the
original (unincremented) value as its result - int x, y 0
- x 2 (y)
- cout ltlt x ltlt " " ltlt y //
- The prefix decrement -- behaves similarly.
0 1 is displayed
16
17I/O
In most programming languages, input and output
are performed by functions with names like read()
and print(). In C, however, (but not C) they
are performed by operators gtgt and
ltlt input_stream gtgt variable output_stream ltlt
expression.
17
printf, scanf
18We know that cin gtgt variable reads a value from
the keyboard and assigns it to variable cout ltlt
expression outputs the value of expression to
the screen.
But these are side effects. Because gtgt and ltlt are
operators, these i/o expessions must also produce
a value.
cin gtgt variable returns ____ as its value cout
ltlt expression returns _____ as its value.
cin
cout
18
Use at end of course
19Why???
Arithmetic operators can be chained together in
expressions like a b c and a - b - c. Input
and output operators can also be chained for
example cout ltlt "Width " ltlt width ltlt "
ft.\n" and cin gtgt length gtgt width These
work because of the values returned by gtgt and ltlt
and both are ___-associative.
left
19
skim
20Example cout ltlt "Width " ltlt width ltlt "
ft.\n" (cout ltlt "Width ") ltlt width ltlt "
ft.\n" ____ ltlt width ltlt " ft.\n" (cout ltlt
width) ltlt " ft.\n" ____ ltlt " ft.\n" ____
cout
cout
cout
Width
8.5
ft.
20
skim
21Relational Operations
5.2
C provides six operators for comparisons. Each
has two operands and produces a bool value (true
or false)
- x y x ! y
- x lt y x gt y
- x gt y x lt y
Warning 1 lt x lt 2
21
boolean expressions Chap. 5 prep. for
control list on board
22- C, the parent language of C, has no bool type.
- Instead, it uses 0 to represent false
- and nonzero values to represent true.
- For upward compatibility, C also does this
- 0 is interpreted as false
- nonzero is interpreted as true
For input and output, 0 is used for false, 1 for
true (see program on Slide 29) unless boolalpha
is inserted in an I/O statement (see modification
of program on Slide 29). It remains in effect
for rest of program (unless noboolalpha is used
in an I/O statement).
22
dec, oct, hex
23One of the easiest mistakes to make in C is
using in place of (equality). See the program
on Slide 24.
(assignment)
Also, it can be dangerous to compare reals with
and ! when one or both of the reals may have
roundoff error. See the program on Slide 25.
23
24- include ltiostreamgt
- using namespace std
- int main()
-
- int x
- cout ltlt "Enter an integer "
- cin gtgt x
- if (x 99)
- cout ltlt "Yes\n"
- else
- cout ltlt "No\n"
Executions Enter an integer 99 Yes Enter an
integer -99 Yes Enter an integer 0 Yes
With change if (x 99) Enter an integer
99 Yes Enter an integer -99 No Enter an
integer 0 No
24
25Execution 0 0 0.1 0.104873 0.2 0.218968 .
. . 49.9998 42.937 50.0998 45.7826 50.1998
48.5246 . . . 100.099 76.3241 . . .
- //-- Effect of roundoff error
- include ltiostreamgt
- include ltcmathgt
- using namespace std
- int main()
-
- for (float x 0 x ! 50.0 x x 0.1)
-
- float y x sqrt(1 sin(x))
- cout ltlt x ltlt " " ltlt y ltlt endl
-
-
With change for (float x 0 x lt 50.0 x
x 0.1) Execution 0 0 0.1 0.104873 0.2
0.218968 . . . 49.7998 36.9654 49.8998
39.9954 49.9998 42.937
or abs(x - 50) gt 1E-10
25
26Preconditions
e.g., Project 2.3
- Sometimes values must satisfy certain
requirements for a program to process them (e.g.,
they must be positive).
Such requirements are called preconditions or
assertions . They are boolean expressions that
must be true in order for the program to work
correctly. A convenient way to check
preconditions is to use Cs assert() mechanism.
if statement later
26
Proj. 2 b2 gt 4ac Proj. 3 payment gt purchase
27Assertions
- include ltiostreamgtusing namespace stdint
main() cout ltlt "\nEnter the current month
number " int month cin gtgt month - assert(month gt 1) assert(month lt 12)
include ltcassertgt
// ... assert() will halt the program if
month lt 1 or month gt 12 and display a message.
27
assert1
28Logical Operators
- More complex boolean expressions can be built
using the logical operators - b1 b1 // true iff b1, b2 are both true
- b1 b2 // true iff b1 or b2 is true
- !b // true iff b is false
- Example
- cin gtgt month
assert(1 lt month month lt 12)
NOT assert(1 lt month lt 12)
28
assert1
29- include ltiostreamgt
- using namespace std
- int main()
-
- bool input1, input2, output
-
- cout ltlt "Enter inputs "
- cin gtgt input1 gtgt input2
- output (input1 input2) !(input1
input2) - cout ltlt "Output for inputs " ltlt input1
- ltlt " and " ltlt input2 ltlt " is " ltlt output
ltlt '\n'
Executions Enter inputs 0 1 Output for inputs 0
and 1 is 1 Enter inputs 1 1 Output for inputs 1
and 1 is 0
Binary Half-Adder (5.3)Full Adder
(ProgrammingProblems)
With change cout ltlt "Output for inputs " ltlt
boolalpha ltlt input1 ltlt " and " ltlt input2 ltlt
" is " ltlt output ltlt '\n' Enter inputs 0
1 Output for inputs false and true is true
With change cin gtgt boolalpha gtgt input1 gtgt
input2 Enter inputs false true Output for
inputs false and true is true
29
XOR circuit
30Character Functions
SeeApp. D
- The library ltcctypegt contains an assortment of
boolean character-processing functions - isalpha(ch) isalnum(ch)
- isdigit(ch) iscntrl(ch)
- islower(ch) isupper(ch)
- isspace(ch) ispunct(ch)
- isprint(ch) isgraph(ch)
- and two case-conversion functions
- toupper(ch) tolower(ch)
30
31Examples
- Write an assertion that will halt the program if
a char object named ch is not an uppercase letter
assert('A' lt ch ch lt 'Z')
or assert(isupper(ch))
Write an assertion that will halt the program if
ch is not one of 'A' through 'G' assert('A'
lt ch ch lt 'G')
31
use later - menu
32Operator Precedence
- ( )
HIGHER - (positive), - (negative), ! (NOT)
- , /,
- (addition), - (subtraction)
- lt, lt, gt, gt
- ltlt, gtgt
- , !
-
-
-
LOWER - See Appendix C for a complete list.
54 operators 18 precedencelevels
When in doubt, use parentheses!
32
33 Operator Associativity Overloada
ble Arity Description right no unary g
lobal scope left no binary class
scope . left no binary direct member
selection - left yes binary indirect
member selection left yes binary subsc
ript (array index) () left yes n/a functi
on call () left yes n/a type
construction sizeof right n/a unary size
(in bytes) of an object or type
right yes unary increment
-- right yes unary decrement
right yes unary bitwise NOT
! right yes unary logical NOT
right yes unary plus (sign)
- right yes unary minus (sign)
right yes unary pointer dereferencing
right yes unary get address of an object
new right yes unary memory allocation
delete right yes unary memory deallocation () righ
t yes binary type conversion (cast) . left no bina
ry direct member pointer selection -gt left yes bin
ary indirect member pointer selection left yes b
inary multiplication / left yes binary division
left yes binary modulus (remainder) left yes bin
ary addition - left yes binary subtraction ltlt left
yes binary bit-shift left gtgt left yes binary bit-
shift right lt left yes binary less-than lt left ye
s binary less-than-or-equal gt left yes binary grea
ter-than gt left yes binary greater-than-or-equal
left yes binary equality ! left yes binary ine
quality left yes binary bitwise
AND left yes binary bitwise XOR left yes binar
y bitwise OR left yes binary logical
AND left yes binary logical OR ?
left no ternary conditional expression right y
es binary assignment right yes binary addition-
assignment shortcut - right yes binary subtractio
n-assignment shortcut right yes binary multipli
cation-assignment shortcut / right yes binary div
ision-assignment shortcut right yes binary modu
lus-assignment shortcut right yes binary bitwis
e-AND-assignment shortcut right yes binary bitw
ise-OR-assignment shortcut right yes binary bit
wise-XOR-assignment shortcut ltlt right yes binary
bitshift-left-assignment shortcut gtgt right yes bi
nary bitshift-right-assignment shortcut throw righ
t yes unary throw an exception , left yes binary e
xpression separation
33