usual arithmetic operators are available +, -, *, /, ** (given here in increasing order of precedence). Parentheses are used to indicate the order of evaluation where necessary: a*b + c ! * first a*(b + c) ! + first The rules for scalar numeric expressions and assignments accommodate the non-default kinds. Thus, the mixed-mode numeric expression and assignment rules incorporate different kind type parameters in an expected way: real2 = integer0 + real1 converts integer0 to a real value of the same kind as real1; the result is of same kind, and is converted to the kind of real2 for assignment. These functions are available for controlled rounding of real numbers to integers: NINT: round to nearest integer, return integer result ANINT: round to nearest integer, return real result INT: truncate (round towards zero), return integer result AINT: truncate (round towards zero), return real result CEILING: smallest integral value not less than argument (round up) (Fortran-90) FLOOR: largest integral value not greater than argument (round down) (Fortran-90) Scalar relational operations For scalar relational operations of numeric types, there is a set of built-in operators: < <= == /= > >= .LT. .LE. .EQ. .NE. .GT. .GE. (the forms above are new to Fortran-90, and older equivalent forms are given below them). Example expressions: a < b .AND. i /= j ! for numeric variables flag = a == b ! for logical variable flags Scalar characters In the case of scalar characters and given CHARACTER(8) result it is legal to write result(3:5) = result(1:3) ! overlap allowed result(3:3) = result(3:2) ! no assignment of null string Concatenation is performed by the operator '//'. result = 'abcde'//'123' filename = result//'.dat' Derived-data types No built-in operations (except assignment, defined on component-by component basis) exist between derived data types mutually or with intrinsic types. The meaning of existing or user-specified operators can be (re)defined though: TYPE string80 INTEGER length CHARACTER(80) value END TYPE string80 CHARACTER:: char1, char2, char3 TYPE(string80):: str1, str2, str3 we can write str3 = str1//str2 ! must define operation str3 = str1.concat.str2 ! must define operation char3 = char2//char3 ! intrinsic operator only str3 = char1 ! must define assignment Notice the "overloaded" use of the intrinsic symbol // and the named operator, .concat. . A difference between the two cases is that, for an intrinsic operator token, the usual precedence rules apply, whereas for named operators, precedence is