Difference between revisions of "Basic Pascal Tutorial/Chapter 3/IF"

From Lazarus wiki
Jump to navigationJump to search
(t/c)
m (bypass language bar/categorization template redirect [cf. discussion])
 
(6 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{IF}}
+
{{Basic Pascal Tutorial/Chapter 3/IF}}
{{TYNavigator|Boolean_Expressions|CASE}}
+
{{TYNavigator|Chapter 3/Boolean Expressions|Chapter 3/CASE}}
  
  
Line 8: Line 8:
 
3Ca - IF (author: Tao Yue, state: changed)
 
3Ca - IF (author: Tao Yue, state: changed)
  
The <tt>IF</tt> statement allows you to branch based on the result of a Boolean operation. The one-way branch format is:
+
The <tt>IF</tt> statement allows you to branch based on the result of a Boolean operation.  
 +
== Format ==
 +
: '''IF''' ''expression'' THEN
 +
: ''statemrnt1''
 +
: [ ELSE
 +
: ''statement2'']
 +
 
 +
Where
 +
: ''expression'' is any comparison, constant or function which returns a [[boolen]] value,  and
 +
: ''statement1'' and ''statement2'' are either a single [[statement]], a [[begin|Begin]]-[[End|end]] [[Block|block]], a [[Repeat|repeat]]-until block, or the [[;#empty statement|null statement]].
 +
The '''ELSE''' clause is optional.
 +
 
 +
There are two ways to use an <tt>IF</tt> statement, a one-way branch or a two-way branch/
 +
 
 +
==One-way branch==
 +
 
 +
The one-way branch format is:
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
Line 17: Line 33:
 
If the Boolean expression evaluates to <tt>true</tt>, the statement executes. Otherwise, it is skipped.
 
If the Boolean expression evaluates to <tt>true</tt>, the statement executes. Otherwise, it is skipped.
  
The <tt>IF</tt> statement accepts only one statement. If you would like to branch to a compound statement, you must use a <tt>begin-end</tt> [[block]] to enclose the statements:
+
The <tt>IF</tt> statement accepts only one statement. If you would like to use a [[compound statement]], you must use a <tt>begin-end</tt> [[Frame|frame]] to enclose the statements:
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
Line 26: Line 42:
 
end;  
 
end;  
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
==Two-way branch==
 
There is also a two-way selection:
 
There is also a two-way selection:
  
Line 36: Line 52:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Note (with one special exception explained below) there is no <tt>;</tt> following the statement before the <tt>else</tt>, even for the case with compound statements.
+
Note there is never a semicolon <tt>;</tt> immediately before the <tt>else</tt>.
  
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
 
if BooleanExpression then
 
if BooleanExpression then
 
begin
 
begin
   Statement1;
+
   Statement1; // semicolon here is mandatory
   Statement2;
+
   Statement2; // semicolon here is optional
end
+
end   // semicolon here is forbidden
 
else
 
else
 
begin
 
begin
Line 51: Line 67:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
+
If the Boolean expression evaluates to <tt>FALSE</tt>, the statement following the <tt>else</tt> will be performed. Note that you may <u>never</u> use a semicolon after the statement preceding the <tt>else</tt>. That causes the computer to treat it as a one-way selection, leaving it to wonder where the else came from. And when a compiler wonders, it usually gets mad and throws a tantrum, or rather, it throws an error
If the Boolean expression evaluates to <tt>FALSE</tt>, the statement following the <tt>else</tt> will be performed. Note that (again, with one exception explained below) you may not use a semicolon after the statement preceding the <tt>else</tt>. That causes the computer to treat it as a one-way selection, leaving it to wonder where the else came from.
 
  
 
If you need multi-way selection, simply nest <tt>if</tt> statements:
 
If you need multi-way selection, simply nest <tt>if</tt> statements:
Line 98: Line 113:
 
Or you could use a <tt>begin-end</tt> block.  
 
Or you could use a <tt>begin-end</tt> block.  
  
''However,'' there is one special exception for just this case where a semicolon is not only allowed before an else statement, it is ''mandatory.'' Here is where it is required:
+
The following proves a semicolon is ''absolutely forbidden'' before an else:
 
<syntaxhighlight lang=pascal>
 
<syntaxhighlight lang=pascal>
if Condition1 then
+
// Paul Robinson 2020-12-16
  if Condition2 then
+
 
    Statement2;
+
// Compiler test program  Err03.pas
else
+
// tests the proposition that ; is
  Statement1;
+
// never legal before ELSE
 +
 
 +
 
 +
program err03;
 +
Var
 +
    Test,test2: Boolean;
 +
 
 +
 
 +
Begin
 +
 
 +
    Test := True;
 +
    Test2 := true;
 +
 
 +
    if test then
 +
      if test2 then
 +
          Writeln('Reached Part 1'); // semi-colon here should be illegal
 +
    else
 +
        Writeln('Reached Part 2');
 +
 
 +
end.
 
</syntaxhighlight>
 
</syntaxhighlight>
In this particular example, the semicolon before the else warns the compiler that the else applies to the prior If statement. This particular situation - where there are two If statements, one after the other, and the else clause applies to the first statement only - is the one and only time it is permissible to use a semicolon before an else statement. Because most Pascal programmers "know" that you ''can't'' have a semicolon before an else you probably won't see it much if at all, but you should be aware of it.
 
 
 
But the best way to clean up the code would be to rewrite the condition.
 
But the best way to clean up the code would be to rewrite the condition.
  
Line 122: Line 154:
 
Also notice how important indentation is to convey the logic of program code to a human, but the compiler ignores the indentation.  
 
Also notice how important indentation is to convey the logic of program code to a human, but the compiler ignores the indentation.  
  
{{TYNavigator|Boolean_Expressions|CASE}}
+
{{TYNavigator|Chapter 3/Boolean Expressions|Chapter 3/CASE}}

Latest revision as of 15:18, 20 August 2022

български (bg) English (en) français (fr) 日本語 (ja) 中文(中国大陆)‎ (zh_CN)

 ◄   ▲   ► 


Back to Reserved words.


3Ca - IF (author: Tao Yue, state: changed)

The IF statement allows you to branch based on the result of a Boolean operation.

Format

IF expression THEN
statemrnt1
[ ELSE
statement2]

Where

expression is any comparison, constant or function which returns a boolen value, and
statement1 and statement2 are either a single statement, a Begin-end block, a repeat-until block, or the null statement.

The ELSE clause is optional.

There are two ways to use an IF statement, a one-way branch or a two-way branch/

One-way branch

The one-way branch format is:

if BooleanExpression then
  StatementIfTrue;

If the Boolean expression evaluates to true, the statement executes. Otherwise, it is skipped.

The IF statement accepts only one statement. If you would like to use a compound statement, you must use a begin-end frame to enclose the statements:

if BooleanExpression then
begin
  Statement1;
  Statement2;
end;

Two-way branch

There is also a two-way selection:

if BooleanExpression then
  StatementIfTrue
else
  StatementIfFalse;

Note there is never a semicolon ; immediately before the else.

if BooleanExpression then
begin
  Statement1;  // semicolon here is mandatory
  Statement2;  // semicolon here is optional
end    // semicolon here is forbidden
else
begin
  Statement3;
  Statement4;
end;

If the Boolean expression evaluates to FALSE, the statement following the else will be performed. Note that you may never use a semicolon after the statement preceding the else. That causes the computer to treat it as a one-way selection, leaving it to wonder where the else came from. And when a compiler wonders, it usually gets mad and throws a tantrum, or rather, it throws an error

If you need multi-way selection, simply nest if statements:

if Condition1 then
  Statement1
else
  if Condition2 then
    Statement2
  else
    Statement3;

Be careful with nesting. Sometimes the computer won't do what you want it to do:

if Condition1 then
  if Condition2 then
    Statement2
else
  Statement1;

The else is always matched with the most recent if, so the computer interprets the preceding block of code as:

if Condition1 then
  if Condition2 then
    Statement2
  else
    Statement1;

You can get by with a null statement:

if Condition1 then
  if Condition2 then
    Statement2
  else
else
  Statement1;

Or you could use a begin-end block.

The following proves a semicolon is absolutely forbidden before an else:

// Paul Robinson 2020-12-16

// Compiler test program  Err03.pas
// tests the proposition that ; is
// never legal before ELSE


program err03;
Var
    Test,test2: Boolean;


Begin

    Test := True;
    Test2 := true;

    if test then
       if test2 then
           Writeln('Reached Part 1');  // semi-colon here should be illegal
     else
        Writeln('Reached Part 2');

end.

But the best way to clean up the code would be to rewrite the condition.

if not Condition1 then
  Statement1
else
  if Condition2 then
    Statement2;

This example illustrates where the not operator comes in very handy. If Condition1 had been a Boolean like: (not(a < b) or (c + 3 > 6)) and g, reversing the expression would be more difficult than NOTting it.

Also notice how important indentation is to convey the logic of program code to a human, but the compiler ignores the indentation.

 ◄   ▲   ►