A dummy argument marked optional may be omitted by the caller. present checks whether it was supplied.

Program

Play the program to call one function with and without an optional multiplication factor.

base
optional_argument.f90
Replay: real traced execution (multi-file project)
program optional_argument_demo
    implicit none
    integer :: base, doubled, tripled

    base = 6
    doubled = scale(base)
    tripled = scale(base, 3)
    print '(I0, A, I0)', doubled, " ", tripled
contains
    function scale(value, factor) result(out)
        integer, intent(in) :: value
        integer, intent(in), optional :: factor
        integer :: out
        if (present(factor)) then
            out = value * factor
        else
            out = value * 2
        end if
    end function scale
end program optional_argument_demo
program optional_argument_demo
    implicit none
    integer :: base, doubled, tripled

    base = 4
    doubled = scale(base)
    tripled = scale(base, 3)
    print '(I0, A, I0)', doubled, " ", tripled
contains
    function scale(value, factor) result(out)
        integer, intent(in) :: value
        integer, intent(in), optional :: factor
        integer :: out
        if (present(factor)) then
            out = value * factor
        else
            out = value * 2
        end if
    end function scale
end program optional_argument_demo
program optional_argument_demo
    implicit none
    integer :: base, doubled, tripled

    base = 9
    doubled = scale(base)
    tripled = scale(base, 3)
    print '(I0, A, I0)', doubled, " ", tripled
contains
    function scale(value, factor) result(out)
        integer, intent(in) :: value
        integer, intent(in), optional :: factor
        integer :: out
        if (present(factor)) then
            out = value * factor
        else
            out = value * 2
        end if
    end function scale
end program optional_argument_demo
  1. base ← 6

    5base = 66doubled = scale(base)
    values this step6base
  2. doubled ← 12

    5base = 66doubled = scale(base)7tripled = scale(base, 3)
    values this step12doubled6base
  3. tripled ← 18

    6doubled = scale(base)7tripled = scale(base, 3)8print '(I0, A, I0)', doubled, " ", tripled
    values this step18tripled6base
  4. print '(I0, A, I0)', doubled, " ", tripled

    7    tripled = scale(base, 3)8    print '(I0, A, I0)', doubled, " ", tripled9contains
    output12 18
    values this step12doubled18tripled
  1. base ← 4

    5base = 46doubled = scale(base)
    values this step4base
  2. doubled ← 8

    5base = 46doubled = scale(base)7tripled = scale(base, 3)
    values this step8doubled4base
  3. tripled ← 12

    6doubled = scale(base)7tripled = scale(base, 3)8print '(I0, A, I0)', doubled, " ", tripled
    values this step12tripled4base
  4. print '(I0, A, I0)', doubled, " ", tripled

    7    tripled = scale(base, 3)8    print '(I0, A, I0)', doubled, " ", tripled9contains
    output8 12
    values this step8doubled12tripled
  1. base ← 9

    5base = 96doubled = scale(base)
    values this step9base
  2. doubled ← 18

    5base = 96doubled = scale(base)7tripled = scale(base, 3)
    values this step18doubled9base
  3. tripled ← 27

    6doubled = scale(base)7tripled = scale(base, 3)8print '(I0, A, I0)', doubled, " ", tripled
    values this step27tripled9base
  4. print '(I0, A, I0)', doubled, " ", tripled

    7    tripled = scale(base, 3)8    print '(I0, A, I0)', doubled, " ", tripled9contains
    output18 27
    values this step18doubled27tripled
optional `optional` allows a dummy argument to be left out.
present `present(factor)` is true only when the caller supplied `factor`.
result `result(out)` names the function return variable.