CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 CMPE-013/L Operators Gabriel Hugh Elkaim Spring 2012.

Slides:



Advertisements
Similar presentations
Department of Computer Science. Definition “An operator is a symbol (+,-,*,/) that directs the computer to perform certain mathematical or logical manipulations.
Advertisements

IntroductionIntroduction  Computer program: an ordered sequence of statements whose objective is to accomplish a task.  Programming: process of planning.
All the Operators. Precedence An operator with higher precedence is done earlier (prededes) one with lower precedence –A higher precedence is indicated.
All the Operators. Precedence An operator with higher precedence is done earlier (prededes) one with lower precedence –A higher precedence is indicated.
© Janice Regan, CMPT 102, Sept CMPT 102 Introduction to Scientific Computer Programming Expressions and Operators Program Style.
More on Numerical Computation CS-2301 B-term More on Numerical Computation CS-2301, System Programming for Non-majors (Slides include materials from.
Lecture 02 Data Types, Conversions if Statements METU Dept. of Computer Eng. Summer 2002 Ceng230 - Section 01 Introduction To C Programming by Ahmet Sacan.
CS 3850 Lecture 5 Operators. 5.1 Binary Arithmetic Operators Binary arithmetic operators operate on two operands. Register and net (wire) operands are.
0 Chap. 2. Types, Operators, and Expressions 2.1Variable Names 2.2Data Types and Sizes 2.3Constants 2.4Declarations Imperative Programming, B. Hirsbrunner,
Expressions An expression is a sequence of operands and operators that reduces to a single value expression operator operand An operator is a language-specific.
More about Numerical Computation CS-2301, B-Term More about Numerical Computation CS-2301, System Programming for Non-Majors (Slides include materials.
0 Chap. 2. Types, Operators, and Expressions 2.1Variable Names 2.2Data Types and Sizes 2.3Constants 2.4Declarations System-oriented Programming, B. Hirsbrunner,
Performing Computations C provides operators that can be applied to calculate expressions: example: tax is 8.5% of the total sale expression: tax =
Java Primitives The Smallest Building Blocks of the Language (corresponds with Chapter 2)
CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2013 CMPE-013/L Operators Gabriel Hugh Elkaim Spring 2012.
CHAPTER:8 OPERATORS AND EXPRESSION IN C++ Prepared By Prepared By : VINAY ALEXANDER ( विनय अलेक्सजेंड़र ) PGT(CS),KV JHAGRAKHAND.
Chapter 2 part #4 Operator
DEPARTMENT OF COMPUTER SCIENCE & TECHNOLOGY FACULTY OF SCIENCE & TECHNOLOGY UNIVERSITY OF UWA WELLASSA 1 CST 221 OBJECT ORIENTED PROGRAMMING(OOP) ( 2 CREDITS.
Object-Oriented Programming Using C++ Third Edition Chapter 2 Evaluating C++ Expressions.
Operators Using Java operators An operator takes one or more arguments and produces a new value. All operators produce a value from their.
CHAPTER 2 PART #4 OPERATOR 2 nd semester King Saud University College of Applied studies and Community Service Csc 1101 By: Asma Alosaimi Edited.
C Operators. CONTENTS CONDITIONAL OPERATOR SIMPLE ASSIGNMENT OPERATOR COMPOUND ASSIGNMENT OPERATOR BITWISE OPERATOR OPERATOR PRECEDENCE.
C Programming Lecture 6 : Operators Lecture notes : courtesy of Ohio Supercomputing Center, and Prof. Woo and Prof. Chang.
C++ Basics Tutorial 6 Operators. What are going to see today? Assignment operator(=) Arithmetic operators(+,-,*,/,%) Compound assignment(+=,-=,*=……..)
CPS120: Introduction to Computer Science Operations Lecture 9.
C Operators. CONTENTS C OPERATORS TYPES OF OPERATOR UNARY BINARY TERNARY ARITHMATIC RELATIONAL LOGICAL.
CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 CMPE-013/L Pointers Gabriel Hugh Elkaim Spring 2012.
Operators Precedence - Operators with the highest precedence will be executed first. Page 54 of the book and Appendix B list C's operator precedence. Parenthesis.
15-Nov-15 All the Operators. operators.ppt 2 Precedence An operator with higher precedence is done earlier (precedes) one with lower precedence A higher.
Types of C Variables:  The following are some types of C variables on the basis of constants values it has. For example: ○ An integer variable can hold.
Expressions and Operators in C. Expressions and Operators Examples: 3 + 5; x; x=0; x=x+1; printf("%d",x); Two types: – Function calls – The expressions.
Operators & Expressions
Tokens in C  Keywords  These are reserved words of the C language. For example int, float, if, else, for, while etc.  Identifiers  An Identifier is.
0 Chap.2. Types, Operators, and Expressions 2.1Variable Names 2.2Data Types and Sizes 2.3Constants 2.4Declarations 2.5Arithmetic Operators 2.6Relational.
ECE 103 Engineering Programming Chapter 4 Operators Herbert G. Mayer, PSU CS Status 6/19/2015 Initial content copied verbatim from ECE 103 material developed.
Expression and Operator. Expressions and Operators u Examples: 3 + 5; x; x=0; x=x+1; printf("%d",x); u Two types: –Function calls –The expressions formed.
CS 161 Introduction to Programming and Problem Solving Chapter 12 C++ Statements Herbert G. Mayer, PSU Status 10/8/2014 Initial content copied verbatim.
OPERATORS IN C CHAPTER 3. Expressions can be built up from literals, variables and operators. The operators define how the variables and literals in the.
1 Chapter 3 – Operators and Expressions Outline 3.1Introduction 3.2Arithmetic operators 3.3Relational operators 3.4Logical operators 3.5Assignment operators.
ECE 103 Engineering Programming Chapter 4 Operators Herbert G. Mayer, PSU Status 6/10/2016 Initial content copied verbatim from ECE 103 material developed.
Operators & Expressions
CSE 220 – C Programming Expressions.
Lecture 3 Java Operators.
Chapter 12 Variables and Operators
Chap. 2. Types, Operators, and Expressions
University of Central Florida COP 3330 Object Oriented Programming
University of Central Florida COP 3330 Object Oriented Programming
Chapter 3 - Operators Arithmetic Operators Assignment
Assignment and Arithmetic expressions
Variable Declaration, Data types, Expressions
Operators and Expressions
Chapter 12 Variables and Operators
Lecture 3 Expressions Richard Gesick.
Character Set The character set of C represents alphabet, digit or any symbol used to represent information. Types Character Set Uppercase Alphabets A,
More about Numerical Computation
All the Operators 4-Dec-18.
C Operators, Operands, Expressions & Statements
Chapter-3 Operators.
Homework Homework Continue Reading K&R Chapter 2 Questions?
Chapter 3 Operators and Expressions
Data Types and Expressions
All the Operators 6-Apr-19.
All the Operators 13-Apr-19.
Herbert G. Mayer, PSU CS Status 7/19/2015
ENERGY 211 / CME 211 Lecture 5 October 1, 2008.
OPERATORS in C Programming
Data Types and Expressions
OPERATORS in C Programming
Data Types and Expressions
Chapter 12 Variables and Operators
Presentation transcript:

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 CMPE-013/L Operators Gabriel Hugh Elkaim Spring 2012

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Definition Operators How to Code Arithmetic Expressions Operands may be variables, constants or functions that return a value –A microcontroller register is usually treated as a variable There are 9 arithmetic operators that may be used –Binary Operators: +, -, *, /, % –Unary Operators: +, -, ++, -- An arithmetic expression is an expression that contains one or more operands and arithmetic operators.

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Negative - (unary) Subtraction - Positive + (unary) Modulo % Addition+ Operators Arithmetic NOTE - An int divided by an int returns an int: 10/3 = 3 Use modulo to get the remainder: 10%3 = 1 Multiplication * Division/ OperatorResultOperationExample -x x - y +x x % y x + y x * y x / y Negative value of x Difference of x and y Value of x Remainder of x divided by y Sum of x and y Product of x and y Quotient of x and y

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 If both operands are an integer type, the result will be an integer type (int, char) If one or both of the operands is a floating point type, the result will be a floating point type (float, double) Example: Integer DivideExample: Floating Point Divide Operators Division Operator int a = 10; int b = 4; float c; c = a / b; int a = 10; float b = 4.0f; float c; c = a / b; c = Because: int / int  int c = Because: float / int  float  

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Implicit Type Conversion In many expressions, the type of one operand will be temporarily "promoted" to the larger type of the other operand A smaller data type will be promoted to the largest type in the expression for the duration of the operation Example int x = 10; float y = 2.0, z; z = x * y; // x promoted to float

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Implicit Arithmetic Type Conversion Hierarchy char int unsigned int long unsigned long long unsigned long long float double long double unsigned char Smaller types converted to largest type in expression short unsigned short

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring x x is promoted to int int5 x * -2L x is promoted to long because -2L is a long long10 8/x x is promoted to int int 8%x int3 8.0/x x is promoted to double because 8.0 is a double double-1.6 ExpressionImplicit Type ConversionExpression's Type Operators Arithmetic Expression Implicit Type Conversion Assume x is defined as: short x = -5; Result Example implicit type conversions

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Applications of the Modulus Operator (%) Truncation: x % 2 n where n is the desired word width (e.g. 8 for 8 bits: x % 256 ) –Returns the value of just the lower n -bits of x Can be used to break apart a number in any base into its individual digits Example #define MAX_DIGITS 6 long number = ; int i, radix = 10; char digits[MAX_DIGITS]; for (i = 0; i < MAX_DIGITS; i++) { if (number == 0) break; if (number == 0) break; digits[i] = (char)(number % radix); digits[i] = (char)(number % radix); number /= radix; number /= radix;}

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Arithmetic: Increment and Decrement x = 5; y = (x++) + 5; // y = 10 // x = 6 x = 5; y = (++x) + 5; // y = 11 // x = 6 OperatorResultOperationExample Decrement-- Increment++ x-- --x x++ ++x Use x then decrement x by 1 Decrement x by 1, then use x Use x then increment x by 1 Increment x by 1, then use x Postfix ExamplePrefix Example

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Definition Operators How to Code Assignment Statements Two types of assignment statements –Simple assignment variable = expression; The expression is evaluated and the result is assigned to the variable –Compound assignment variable = variable op expression; The variable appears on both sides of the = An assignment statement is a statement that assigns a value to a variable.

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 >>= |= <<= ^= x >>= y x |= y x <<= y x ^= y x = x >> y x = x | y x = x << y x = x ^ y &= /= %= -= *= Assignment= += x &= y x /= y x %= y x -= y x *= y x = y x += y x = x & y x = x / y x = x % y x = x - y x = x * y Assign x the value of y x = x + y Operators Assignment OperatorResultOperationExample Assignment Compound

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Statements with the same variable on each side of the equals sign: May use the shortcut assignment operators (compound assignment): Example Operators Compound Assignment x = x + y; Example x += y; //Increment x by the value y This operation may be thought of as: The new value of x will be set equal to the current value of x plus the value of y

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Example Operators Compound Assignment int x = 2; //Initial value of x is 2 x *= 5; //x = x * 5 Before statement is executed: x = 2 After statement is executed: x = 10 x *= 5; x *= 5; x = (x * 5); x = (x * 5); x = (2 * 5); x = (2 * 5); x = 10; x = 10; Is equivalent to: Evaluate right side first: Assign result to x :

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Relational In conditional expressions, any non-zero value is interpreted as TRUE. A value of 0 is always FALSE. OperatorResult (FALSE = 0, TRUE ≠ 0) OperationExample Equal to == Not equal to != Greater than > Greater than or equal to >= Less than < Less than or equal to <= x == y x != y x > y x >= y x < y x <= y 1 if x equal to y, else 0 1 if x not equal to y, else 0 1 if x greater than y, else 0 1 if x greater than or equal to y, else 0 1 if x less than y, else 0 1 if x less than or equal to y, else 0

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Difference Between = and == = is the assignment operator x = 5 assigns the value 5 to the variable x == is the 'equals to' relational operator x == 5 tests whether the value of x is 5 Be careful not to confuse = and ==. They are not interchangeable! if (x == 5) { do if value of x is 5 }

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Example Operators Difference Between = and == What happens when the following code is executed? void main(void) { int x = 2; //Initialize x int x = 2; //Initialize x if (x = 5) //If x is 5,… if (x = 5) //If x is 5,… { printf("Hi!"); //…display "Hi!" printf("Hi!"); //…display "Hi!" }}

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Logical Logical NOT ! Logical OR || Logical AND && !x x || y x && y 1 if x = 0, else 0 0 if both x = 0 and y = 0, else 1 1 if both x ≠ 0 and y ≠ 0, else 0 OperatorResult (FALSE = 0, TRUE ≠ 0) OperationExample In conditional expressions, any non-zero value is interpreted as TRUE. A value of 0 is always FALSE.

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Bitwise OperatorResult (for each bit position) OperationExample Bitwise XOR ^ Bitwise NOT (One's Complement) ~ Bitwise AND & Bitwise OR | x ^ y ~x x & y x | y 1, if 1 in x or y but not both 0, if 0 or 1 in both x and y 1, if 0 in x 0, if 1 in x 1, if 1 in both x and y 0, if 0 in x or y or both 1, if 1 in x or y or both 0, if 0 in both x and y The operation is carried out on each bit of the first operand with each corresponding bit of the second operand

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Difference Between & and && & is the bitwise AND operator 0b1010 & 0b1101  0b1000 && is the logical AND operator 0b1010 && 0b1101  0b0001 (TRUE) &&  1 (TRUE) Be careful not to confuse & and &&. They are not interchangeable! if (x && y) { do if x and y are both TRUE (non-zero) }

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Difference Between & and && What happens when each of these code fragments are executed? Example 1 – Using A Bitwise AND Operator Example 2 – Using A Logical AND Operator char x = 0b1010; char y = 0b0101; if (x && y) printf("Hi!"); char x = 0b1010; char y = 0b0101; if (x & y) printf("Hi!");

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Logical Operators and Short Circuit Evaluation The evaluation of expressions in a logical operation stops as soon as a TRUE or FALSE result is known Example If we have two expressions being tested in a logical AND operation: expr1 && expr2 The expressions are evaluated from left to right. If expr1 is 0 (FALSE), then expr2 would not be evaluated at all since the overall result is already known to be false. expr1 expr2 Result 0 0 X (0) X (1) Truth Table for AND (&&) FALSE = 0 TRUE = 1 expr2 is not evaluated in the first two cases since its value is not relevant to the result.

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Example Operators Logical Operators and Short Circuit Evaluation The danger of short circuit evaluation if !((z = x + y) && (c = a + b)) { z += 5; z += 5; c += 10; c += 10;} It is perfectly legal in C to logically compare two assignment expressions in this way, though it is not usually good programming practice. A similar problem exists when using function calls in logical operations, which is a very common practice. The second function may never be evaluated. If z = 0, then c will not be evaluated Initial value of c may not be correct

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Shift Shift Left Example: x = 5;// x = 0b = 5 y = x << 2;// y = 0b = 20 In both shift left and shift right, the bits that are shifted out are lost For shift left, 0's are shifted in (Zero Fill) OperatorResultOperationExample Shift Left << Shift Right >> x << y x >> y Shift x by y bits to the left Shift x by y bits to the right

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Logical Shift Right (Zero Fill) Arithmetic Shift Right (Sign Extend) Operators Shift – Special Cases If x is UNSIGNED ( unsigned char in this case): x = 250;// x = 0b = 250 y = x >> 2;// y = 0b = 62 If x is SIGNED ( char in this case): x = -6;// x = 0b = -6 y = x >> 2;// y = 0b = -2

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring Operators Power of 2 Integer Divide vs. Shift Right If you are dividing by a power of 2, it will usually be more efficient to use a right shift instead Works for integers or fixed point values y = x / 2 n y = x >> n >> Right Shift

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Power of 2 Integer Divide vs. Shift in MPLAB ® C30 Example: Divide by 2Example: Right Shift by 1 int x = 20; int y; y = x / 2; int x = 20; int y; y = x >> 1; 10: y = x / 2; mov.w 0x0800,0x A mov.w #0x2,0x C repeat # E D80002 div.sw 0x0000,0x mov.w 0x0000,0x0802 9: y = x >> 1; mov.w 0x0800,0x DE8042 asr 0x0000,#1,0x mov.w 0x0000,0x0802 y = 10

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Example: Divide by 2Example: Right Shift by 1 10: y = x / 2; 0132 C08C MOVFF 0x8c, 0x8a 0134 F08A NOP 0136 C08D MOVFF 0x8d, 0x8b 0138 F08B NOP 013A 0E02 MOVLW 0x2 013C 6E0D MOVWF 0xd, ACCESS 013E 6A0E CLRF 0xe, ACCESS 0140 C08A MOVFF 0x8a, 0x F008 NOP 0144 C08B MOVFF 0x8b, 0x F009 NOP 0148 EC6B CALL 0xd6, 0 014A F000 NOP 014C C008 MOVFF 0x8, 0x8a 014E F08A NOP 0150 C009 MOVFF 0x9, 0x8b 0152 F08B NOP int x = 20; int y; y = x / 2; Operators Power of 2 Integer Divide vs. Shift in MPLAB ® C18 9: y = x >> 1; 0122 C08C MOVFF 0x8c, 0x8a 0124 F08A NOP 0126 C08D MOVFF 0x8d, 0x8b 0128 F08B NOP 012A 0100 MOVLB 0 012C 90D8 BCF 0xfd8, 0, ACCESS 012E 338B RRCF 0x8b, F, BANKED A RRCF 0x8a, F, BANKED int x = 20; int y; y = x >> 1; y = Bit Shift on 8-Bit Architecture

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Memory Addressing These operators will be discussed later in the sections on arrays, pointers, structures, and unions. They are included here for reference and completeness. OperatorResultOperationExample Struct / Union Member by Reference -> Subscripting [] Struct / Union Member. Address of & Indirection * p->y x[y] x.y &x *p The member named y in the structure or union that p points to The y th element of array x The member named y in the structure or union x Pointer to x The object or function that p points to

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Other () sizeof (type) ?:, Function Call Size of an object or type in bytes Explicit type cast Conditional expression Sequential evaluation OperatorResultOperationExample foo(x) Passes control to the function with the specified arguments sizeof x The number of bytes x occupies in memory (short) x Converts the value of x to the specified type x ? y : z The value of y if x is true, else value of z x, y Evaluates x then y, else result is value of y

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Example Syntax Operators The Conditional Operator (test-expr) ? do-if-true : do-if-false; 5 is odd Result: int x = 5; (x % 2 != 0) ? printf("%d is odd\n", x) : printf("%d is odd\n", x) : printf("%d is even\n", x); printf("%d is even\n", x);

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators The Conditional Operator x = a if condition is true x = b if condition is false Example 1 (most commonly used) x = (condition) ? a : b; Example 2 (less often used) (condition) ? (x = a):(x = b); The conditional operator may be used to conditionally assign a value to a variable In both cases:

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators The Explicit Type Cast Operator Example: Integer DivideExample: Floating Point Divide int x = 10; float y; y = x / 4; int x = 10; float y; y = (float)x / 4; y = Because: int / int  int y = Because: float / int  float   Earlier, we cast a literal to type float by entering it as: 4.0f We can cast the variable instead by using the cast operator: (type)variable

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Precedence OperatorDescriptionAssociativity ( ) Parenthesized Expression [ ] Array Subscript. Structure Member -> Structure Pointer Left-to-Right + - Unary + and – (Positive and Negative Signs) Increment and Decrement ! ~ Logical NOT and Bitwise Complement * Dereference (Pointer) & Address of sizeof Size of Expression or Type (type) Explicit Typecast Right-to-Left Continued on next slide…

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 && Logical AND || Logical OR ?: Conditional Operator Left-to-Right Left-to-Right Right-to-Left Operators Precedence OperatorDescriptionAssociativity * / % Multiply, Divide, and Modulus + - Add and Subtract > > Shift Left and Shift Right < <= Less Than and Less Than or Equal To Left-to-Right > >= Greater Than and Greater Than or Equal To == != Equal To and Not Equal To & Bitwise AND ^ Bitwise XOR | Bitwise OR Continued on next slide… Left-to-Right Left-to-Right Left-to-Right Left-to-Right Left-to-Right Left-to-Right Left-to-Right Left-to-Right

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 Operators Precedence OperatorDescriptionAssociativity = Assignment += -= Addition and Subtraction Assignments /= *= Division and Multiplication Assignments %= Modulus Assignment >= >= Shift Left and Shift Right Assignments &= |= Bitwise AND and OR Assignments ^= Bitwise XOR Assignment, Comma Operator Right-to-Left Left-to-Right Operators grouped together in a section have the same precedence – conflicts within a section are handled via the rules of associativity

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 ExpressionEffective Expression Operators Precedence When expressions contain multiple operators, their precedence determines the order of evaluation a – b * c a – (b * c) a + ++b a + (++b) a + ++b * c a + ((++b) * c) If functions are used in an expression, there is no set order of evaluation for the functions themselves. e.g. x = f() + g() There is no way to know if f() or g() will be evaluated first.

CMPE-013/L: “C” Programming Gabriel Hugh Elkaim – Spring 2012 If two operators have the same precedence, their associativity determines the order of evaluation You can rely on these rules, but it is good programming practice to explicitly group elements of an expression Operators Associativity ExpressionEffective ExpressionAssociativity x / y % z (x / y) % z Left-to-Right x = y = z x = (y = z) Right-to-Left ~++x~(++x)Right-to-Left