190 likes | 328 Vues
This document outlines the foundational principles of expressions and assignment statements in programming languages, focusing on the evaluation of arithmetic expressions, operator precedence, associativity, and operand evaluation. It provides insights into constructing and manipulating n-dimensional vectors, calculating their norms, sums, differences, and dot products, as well as reading and analyzing numerical data to compute mean, variance, and standard deviation. Additionally, it delves into conditional expressions and the ternary operator common in modern languages, supporting programmers in enhancing their computational skills.
E N D
CS 330 Organization of Programming Languages Soundararajan Ezekiel Department of Computer Science Ohio Northern University ADA, Ohio 45810 e-mail: s-ezekiel@onu.edu http://www.onu.edu/user/FS/sezekiel
FORTRAN CODE WALK PROBLEMS • 1. Wrtie a program to read two n-dimensional vectors and then evaluate • the norm of each vector • unit vectors having the same direction as the vectors • the sum, difference and dot product • the cosine of the angle between the vectors calculated using cos0 = a.b /(|a||b|)
2. Write a program that reads a list of numbers , count them, and the calculate their mean, variance, and standard deviation. Print how many numbers there are and their mean, variance, and SD
Expressions and Assignment Statements • Introduction • Arithmetic expressions • Overloaded Operators • Type Conversions • Relational and Boolean Expressions • Short-Circuit Evaluation • Assignment Statements • Mixed-Mode Assignments
Introduction • Expressions are the fundamental means of specifying computations in a programming language • Programmers should understand both syntax and semantics of expression • To understand evaluation -- understand the order of operator and operand evaluation • An assignment statement can simply cause a value to be copied from one memory cell to another-- in many case it include expressions with operators, which cause values to be copied to the processor and to be operated on, and the result to be copied back to memory • simple assignment statements specify an expression to be evaluated and a target location in which to place the result of the expression evaluation • we will see number of variation on this basic form
2. Arithmetic Expression • Most of the characteristic of Arithmetic expression were inherited from Math • Consists of operators, operands, parentheses, and function calls • operator can be • unary--- single operands • binary -- double operands • C, C++, Java, - ternary-- three operands • Most cases-- binary operators are infix-- between their operands • In Perl-- some of them are prefix-- precede their operands
The purpose is to specify an arithmetic computation • Implementation of such computation must cause two action • fetching the operands-- usually from memory • executing arithmetic operations on those operands • Design issues • 1. What are the operator precedence rules • 2. What are the operator associativity rules • 3. What is the order of operand evaluation • 4. Are there restrictions on operands evaluation side effect • 5. Does the language allow user-defined operator overloading • 6. What mode mixing is allowed in expression
Precedence • Consider the following expression -- a+b*c • suppose a=3, b=4, c=5---- evaluate left to right=> 35, right to left=> 23 • FORTRAN:- **,* /+- • Pascal: *,/,div, mod+ - • Ada: **, abs*/ unary +/binary +- • C: postfix ++, --prefix ++.-- , unary +-,*/&binary +- • APL is odd among languages because it has single level of precedence
Associativity • consider the following expression a-b+c-d • here + - are the same level of precedence-- this case which operator is evaluated first is answered by the associativity rule of the language • Fortran:- left to right ( exponential right to left A**B**C ) • Ada: exponential is nonassociative-- A**B**C is illegal () should be used that is (A**B)**C or A** (B**C) • FORTRAN and Ada have the exp operator
Language Associativity Rule FORTRAN Left: */+- Right: ** Pascal Left: all C Left: postfix++, postfix--, */%binary+ binary- Right: prefix++ prefix--, unary + unary- C++ Left: */%binary+ binary- Right: ++, --, unary -, unary + Ada Left: all except ** Nonassociativity ** in APL: AxB+C (x means multiplication) A=3, B=4, C=5 then 27 How: associative right to left-- addition first then multiplication
Parentheses • programmers can alter the precedence and associativity rules by placing () in expression --- (A+B)*C • programmer would specify the desired order of evaluation with parentheses • the disadvantage of this scheme is that it makes writing expression more tedious and it also seriously compromises the readability of the code
Conditional expression • we will look at the the ternary operator ?: which is part of C, C++ Java • this operator is used to form conditional expression • sometimes if then else statements are used to perform a conditional expression assignment • example • if (count = = 0) • average =0; • else • average= sum/count; • In C, C++ and Java this can be specified more conveniently in an assignment statement using condition expression
expression_1 ? Expression_2 :expression_3 • expression_1 is Boolean expression--- if that is true do expression_2 otherwise expression_3 • average= (count = = 0)? 0 : sum/count;
Operand evaluation order • A less commonly discussed design characteristics of expression is the order of evaluation of operands • Side Effects:- A side effect of a function called a functional side effect, occurs when the function changes either of its parameters or global variable ( variable declared outside of the function)
Example: • consider the expression a+fun(a) • if fun does not have the side effect of changing a, the order of evaluation is two operands a fun(a) has no effect on value of the expression • if fun changes the value of a say divide by 2 and change its parameter to have the value 20 then it matters • a=10; • b=a+fun(a) • two answers--- 15 from left to right and 25 from right to left
C example • the following c code will the same problem like before • int a=5; • int fun1(){ • a=17; • return 3; • } /* of fun1*/ • void fun2(){ • a=a+fun1(); • } /* of fun2*/ • void main(){ • fun2(); • }/* of main */ The value computed for a in fun2 depends on the order of evaluation of the operands in the expression a+fun1() the value will be 8 or 20
Solution • 1. The language designer could disallow functional side effect • 2. Avoid the problem by stating in the language definition that operands in expressions are to be evaluated in a particular order and demand that implementors guarantee that order
Overloaded operators • Arithmetic operators are often used for more than one purpose • example:- + for addition In Java it is used for string catenation • This multiple use of an operator is called operator overloading
Example • consider the use of ampersand in (&) in C • As a binary operator--- it specifies bitwise logical AND operation • As a Unary operator-- with variable as its operand, the expression value is the address of that variable-- this case & is called address-of operator • example x=&y execution of this causes the address of y to be placed in x