Logical operators are fundamental in programming, enabling decision-making and control flow in programs. Among these operators, the NOT operator (.not.) is essential for reversing the truth value of a logical expression. In Fortran, .not. plays a key role in conditional statements, loops, and complex logical expressions.
1. Introduction to Logical Operators
In programming, logical values represent either true or false. These values are used in decision-making, comparisons, and loops. Fortran provides three primary logical operators:
.and.– Logical AND operator.or.– Logical OR operator.not.– Logical NOT operator
The .not. operator is unique because it reverses the truth value of a logical expression. If an expression is .true., applying .not. makes it .false. and vice versa.
2. Syntax of the NOT Operator
The basic syntax of .not. is simple:
logical :: a, b
b = .not. a
ais a logical variable..not. aproduces the opposite truth value.bstores the reversed result.
3. Basic Example
logical :: p, r
p = .true.
r = .not. p
print *, ".not. p:", r
Explanation:
pis assigned.true..not. preverses its value to.false.- Output:
.not. p: F
The .not. operator is often used in conditional statements to test when a condition is not true.
4. Using NOT in IF Statements
The NOT operator is commonly used in IF statements to reverse a condition:
logical :: isRaining
isRaining = .false.
if (.not. isRaining) then
print *, "It is not raining. Go for a walk."
else
print *, "Stay indoors."
end if
Explanation:
.not. isRainingevaluates to.true.sinceisRainingis.false.- The program prints:
"It is not raining. Go for a walk."
This demonstrates how .not. simplifies logic when checking for the opposite of a condition.
5. Combining NOT with AND and OR
Logical operators can be combined to form complex conditions. The NOT operator is often used with .and. and .or. to create sophisticated expressions.
Example with AND
logical :: a, b, result
a = .true.
b = .false.
result = .not. a .and. b
print *, "Result of .not. a .and. b:", result
Explanation:
.not. a→.false..false. .and. b (.false.)→.false.- Output:
Result of .not. a .and. b: F
Example with OR
logical :: x, y, result
x = .false.
y = .true.
result = .not. x .or. y
print *, "Result of .not. x .or. y:", result
Explanation:
.not. x→.true..true. .or. y (.true.)→.true.- Output:
Result of .not. x .or. y: T
Combining .not. with other operators allows programmers to implement more flexible and complex decision-making logic.
6. Logical Expressions in Loops
The NOT operator is useful in loops where execution depends on a condition being false.
logical :: flag
integer :: i
flag = .false.
do i = 1, 5
if (.not. flag) then
print *, "Iteration", i, "- Flag is false"
else
print *, "Flag is true"
end if
end do
Explanation:
- Since
flagis.false.,.not. flagis.true. - The message prints for each iteration:
"Iteration i - Flag is false"
This pattern is common when a program continues until a condition becomes true, or stops if a condition is not met.
7. Logical Variables and NOT
Logical variables store .true. or .false. and can be directly manipulated using .not.
logical :: success, failure
success = .false.
failure = .not. success
print *, "Failure:", failure
Output: Failure: T
Explanation:
.not. successreverses.false.to.true.- Useful in flag-based programming where a variable indicates the status of an operation.
8. NOT Operator with Comparisons
The .not. operator can be applied to comparison expressions to check for the opposite condition.
integer :: x
logical :: result
x = 10
result = .not. (x > 5)
print *, "Is x NOT greater than 5?", result
Explanation:
(x > 5)→.true..not. (x > 5)→.false.- Output:
Is x NOT greater than 5? F
This approach avoids writing complicated conditional logic and improves code readability.
9. De Morgan’s Laws in Fortran
The NOT operator is often used in conjunction with AND and OR following De Morgan’s laws:
.not. (A .and. B)=.not. A .or. .not. B.not. (A .or. B)=.not. A .and. .not. B
Example:
logical :: A, B, result1, result2
A = .true.
B = .false.
result1 = .not. (A .and. B)
result2 = (.not. A) .or. (.not. B)
print *, "Result1:", result1
print *, "Result2:", result2
Explanation:
A .and. B→.false..not. (A .and. B)→.true.(.not. A) .or. (.not. B)→.false. .or. .true.→.true.- Confirms De Morgan’s equivalence.
10. Practical Applications
10.1 Conditional Execution
logical :: validInput
validInput = .false.
if (.not. validInput) then
print *, "Please enter a valid input."
end if
- Program prompts user if the input is invalid.
10.2 Loop Control
logical :: finished
finished = .false.
integer :: i
do i = 1, 10
if (.not. finished) then
print *, "Processing item", i
end if
end do
- Continues processing while
finishedis false.
10.3 Flag Management
logical :: errorFlag
errorFlag = .true.
print *, "Operation failed:", .not. errorFlag
- Reverses the meaning of a flag for reporting or conditional logic.
11. Combining NOT with Functions
The .not. operator can be applied to the results of functions returning logical values:
logical :: evenCheck
integer :: n
n = 7
evenCheck = mod(n,2) == 0
print *, "Is n NOT even?", .not. evenCheck
mod(n,2) == 0→.false.because 7 is odd.not. evenCheck→.true.- Output:
Is n NOT even? T
This is extremely useful in validation checks and filtering conditions.
12. Common Pitfalls
- Confusing NOT with inequality:
.not.reverses truth, it does not check for inequality. - Operator precedence issues:
.not.has higher precedence than.and.or.or., so parentheses may be necessary. - Overusing NOT: Multiple
.not.operators can reduce readability; simplify expressions where possible.
13. Best Practices
- Use
.not.for clarity when testing opposite conditions. - Combine with parentheses for complex expressions.
- Use in loops and conditional statements to handle flags efficiently.
- Avoid double negation where unnecessary:
.not. (.not. x)→x. - Document logical expressions in complex programs to maintain readability.
Leave a Reply