1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
<TITLE>Ada95 - Assignment Statements</TITLE>
<META NAME="Author" CONTENT="JTC1/SC22/WG9/ARG, by Randall Brukardt, ARG Editor">
<META NAME="GENERATOR" CONTENT="Arm_Form.Exe, Ada Reference Manual generator">
<STYLE type="text/css">
DIV.paranum {position: absolute; font-family: Arial, Helvetica, sans-serif; left: 0.5 em; top: auto}
TT {font-family: "Courier New", monospace}
DT {display: compact}
DIV.Normal {font-family: "Times New Roman", Times, serif; margin-bottom: 0.6em}
DIV.Wide {font-family: "Times New Roman", Times, serif; margin-top: 0.6em; margin-bottom: 0.6em}
DIV.Annotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
DIV.WideAnnotations {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0.6em; margin-bottom: 0.6em}
DIV.Index {font-family: "Times New Roman", Times, serif}
DIV.SyntaxSummary {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
DIV.Notes {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.6em}
DIV.NotesHeader {font-family: "Times New Roman", Times, serif; margin-left: 2.0em}
DIV.SyntaxIndented {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-bottom: 0.4em}
DIV.Indented {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-bottom: 0.6em}
DIV.CodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-bottom: 0.6em}
DIV.SmallIndented {font-family: "Times New Roman", Times, serif; margin-left: 10.0em; margin-bottom: 0.6em}
DIV.SmallCodeIndented {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-bottom: 0.6em}
DIV.Examples {font-family: "Courier New", monospace; margin-left: 2.0em; margin-bottom: 0.6em}
DIV.SmallExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left: 7.5em; margin-bottom: 0.6em}
DIV.IndentedExamples {font-family: "Courier New", monospace; margin-left: 8.0em; margin-bottom: 0.6em}
DIV.SmallIndentedExamples {font-family: "Courier New", monospace; font-size: 80%; margin-left: 15.0em; margin-bottom: 0.6em}
UL.Bulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.SmallBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.NestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.SmallNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.IndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.CodeIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.CodeIndentedNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-right: 8.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.SyntaxIndentedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.NotesBulleted {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
UL.NotesNestedBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
DL.Hanging {font-family: "Times New Roman", Times, serif; margin-top: 0em; margin-bottom: 0.6em}
DD.Hanging {margin-left: 6.0em}
DL.IndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
DD.IndentedHanging {margin-left: 2.0em}
DL.HangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.HangingInBulleted {margin-left: 4.0em}
DL.SmallHanging {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-top: 0em; margin-bottom: 0.6em}
DD.SmallHanging {margin-left: 7.5em}
DL.SmallIndentedHanging {font-family: "Times New Roman", Times, serif; margin-left: 8.0em; margin-top: 0em; margin-bottom: 0.6em}
DD.SmallIndentedHanging {margin-left: 2.0em}
DL.SmallHangingInBulleted {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.SmallHangingInBulleted {margin-left: 5.0em}
DL.Enumerated {font-family: "Times New Roman", Times, serif; margin-right: 0.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.Enumerated {margin-left: 2.0em}
DL.SmallEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 4.0em; margin-right: 4.0em; margin-top: 0em; margin-bottom: 0.5em}
DD.SmallEnumerated {margin-left: 2.5em}
DL.NestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 2.0em; margin-right: 2.0em; margin-top: 0em; margin-bottom: 0.5em}
DL.SmallNestedEnumerated {font-family: "Times New Roman", Times, serif; margin-left: 6.0em; margin-right: 6.0em; margin-top: 0em; margin-bottom: 0.5em}
</STYLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFF0" LINK="#0000FF" VLINK="#800080" ALINK="#FF0000">
<P><A HREF="RM-TOC.html">Contents</A> <A HREF="RM-0-29.html">Index</A> <A HREF="RM-5-1.html">Previous</A> <A HREF="RM-5-3.html">Next</A></P>
<HR>
<H1> 5.2 Assignment Statements</H1>
<DIV Class="Paranum"><FONT SIZE=-2>1</FONT></DIV>
<DIV Class="Normal"> An <FONT FACE="Arial, Helvetica">assignment_statement</FONT>
replaces the current value of a variable with the result of evaluating
an <FONT FACE="Arial, Helvetica">expression</FONT>. </DIV>
<H4 ALIGN=CENTER>Syntax</H4>
<DIV Class="Paranum"><FONT SIZE=-2>2</FONT></DIV>
<DIV Class="SyntaxIndented"><FONT FACE="Arial, Helvetica">assignment_statement<A NAME="I2798"></A>
::= </FONT><BR>
<I>variable_</I><A NAME="I2799"></A><FONT FACE="Arial, Helvetica">name</FONT> := <A NAME="I2800"></A><FONT FACE="Arial, Helvetica">expression</FONT>;</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>3</FONT></DIV>
<DIV Class="Normal"> The execution of an <FONT FACE="Arial, Helvetica">assignment_statement</FONT>
includes the evaluation of the <FONT FACE="Arial, Helvetica">expression</FONT>
and the <I>assignment</I> of the value of the <FONT FACE="Arial, Helvetica">expression</FONT>
into the <I>target</I>. <A NAME="I2801"></A><A NAME="I2802"></A>An assignment
operation (as opposed to an <FONT FACE="Arial, Helvetica">assignment_statement</FONT>)
is performed in other contexts as well, including object initialization
and by-copy parameter passing. <A NAME="I2803"></A><A NAME="I2804"></A>The
<I>target</I> of an assignment operation is the view of the object to
which a value is being assigned; the target of an <FONT FACE="Arial, Helvetica">assignment_statement</FONT>
is the variable denoted by the <I>variable_</I><FONT FACE="Arial, Helvetica">name</FONT>.
</DIV>
<H4 ALIGN=CENTER>Name Resolution Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>4</FONT></DIV>
<DIV Class="Normal"> <A NAME="I2805"></A>The <I>variable_</I><FONT FACE="Arial, Helvetica">name</FONT>
of an <FONT FACE="Arial, Helvetica">assignment_statement</FONT> is expected
to be of any nonlimited type. <A NAME="I2806"></A>The expected type for
the <FONT FACE="Arial, Helvetica">expression</FONT> is the type of the
target. </DIV>
<H4 ALIGN=CENTER>Legality Rules</H4>
<DIV Class="Paranum"><FONT SIZE=-2>5</FONT></DIV>
<DIV Class="Normal"> The target denoted by the <I>variable_</I><FONT FACE="Arial, Helvetica">name</FONT>
shall be a variable.</DIV>
<DIV Class="Paranum"><FONT SIZE=-2>6</FONT></DIV>
<DIV Class="Normal"> If the target is of a tagged class-wide type <I>T</I>'Class,
then the <FONT FACE="Arial, Helvetica">expression</FONT> shall either
be dynamically tagged, or of type <I>T</I> and tag-indeterminate (see
<A HREF="RM-3-9-2.html">3.9.2</A>). </DIV>
<H4 ALIGN=CENTER>Dynamic Semantics</H4>
<DIV Class="Paranum"><FONT SIZE=-2>7</FONT></DIV>
<DIV Class="Normal"> <A NAME="I2807"></A>For the execution of an <FONT FACE="Arial, Helvetica">assignment_statement</FONT>,
the <I>variable_</I><FONT FACE="Arial, Helvetica">name</FONT> and the
<FONT FACE="Arial, Helvetica">expression</FONT> are first evaluated in
an arbitrary order. </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>8</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> When the type of
the target is class-wide: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>9</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC><A NAME="I2808"></A>If the <FONT FACE="Arial, Helvetica">expression</FONT>
is tag-indeterminate (see <A HREF="RM-3-9-2.html">3.9.2</A>), then the
controlling tag value for the <FONT FACE="Arial, Helvetica">expression</FONT>
is the tag of the target; </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>10</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC><A NAME="I2809"></A><A NAME="I2810"></A><A NAME="I2811"></A>Otherwise
(the <FONT FACE="Arial, Helvetica">expression</FONT> is dynamically tagged),
a check is made that the tag of the value of the <FONT FACE="Arial, Helvetica">expression</FONT>
is the same as that of the target; if this check fails, Constraint_Error
is raised. </LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>11</FONT></DIV>
<DIV Class="Normal"> The value of the <FONT FACE="Arial, Helvetica">expression</FONT>
is converted to the subtype of the target. The conversion might raise
an exception (see <A HREF="RM-4-6.html">4.6</A>). <A NAME="I2812"></A></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>12</FONT></DIV>
<DIV Class="Normal"> In cases involving controlled types, the target
is finalized, and an anonymous object might be used as an intermediate
in the assignment, as described in <A HREF="RM-7-6-1.html">7.6.1</A>,
``<A HREF="RM-7-6-1.html">Completion and Finalization</A>''. <A NAME="I2813"></A><A NAME="I2814"></A>In
any case, the converted value of the <FONT FACE="Arial, Helvetica">expression</FONT>
is then <I>assigned</I> to the target, which consists of the following
two steps: </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>13</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>The value of the target becomes the converted value.</LI></UL>
<DIV Class="Paranum"><FONT SIZE=-2>14</FONT></DIV>
<UL Class="Bulleted"><LI TYPE=DISC>If any part of the target is controlled, its value is adjusted
as explained in clause <A HREF="RM-7-6.html">7.6</A>. <A NAME="I2815"></A></LI></UL>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>15</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>2 The tag of an object never
changes; in particular, an <FONT FACE="Arial, Helvetica">assignment_statement</FONT>
does not change the tag of the target.</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>16</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>3 The values of the discriminants
of an object designated by an access value cannot be changed (not even
by assigning a complete value to the object itself) since such objects
are always constrained; however, subcomponents of such objects may be
unconstrained. </FONT></DIV>
<H4 ALIGN=CENTER>Examples</H4>
<DIV Class="Paranum"><FONT SIZE=-2>17</FONT></DIV>
<DIV Class="Normal" Style="margin-bottom: 0.4em"> <I>Examples of
assignment statements:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>18</FONT></DIV>
<DIV Class="Examples"><TT>Value := Max_Value - 1;<BR>
Shade := Blue;</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>19</FONT></DIV>
<DIV Class="Examples"><TT>Next_Frame(F)(M, N) := 2.5; --<I> see <A HREF="RM-4-1-1.html">4.1.1</A></I><BR>
U := Dot_Product(V, W); --<I> see <A HREF="RM-6-3.html">6.3</A></I></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>20</FONT></DIV>
<DIV Class="Examples"><TT>Writer := (Status => Open, Unit => Printer, Line_Count => 60); --<I> see <A HREF="RM-3-8-1.html">3.8.1</A></I><BR>
Next_Car.<B>all</B> := (72074, <B>null</B>); --<I> see <A HREF="RM-3-10-1.html">3.10.1</A></I></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>21</FONT></DIV>
<DIV Class="Wide" Style="margin-bottom: 0.4em"> <I>Examples involving
scalar subtype conversions:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>22</FONT></DIV>
<DIV Class="Examples"><TT>I, J : Integer <B>range</B> 1 .. 10 := 5;<BR>
K : Integer <B>range</B> 1 .. 20 := 15;<BR>
...</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>23</FONT></DIV>
<DIV Class="Examples"><TT>I := J; --<I> identical ranges</I><BR>
K := J; --<I> compatible ranges</I><BR>
J := K; --<I> will raise Constraint_Error if K > 10</I></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>24</FONT></DIV>
<DIV Class="Wide" Style="margin-bottom: 0.4em"> <I>Examples involving
array subtype conversions:</I> </DIV>
<DIV Class="Paranum"><FONT SIZE=-2>25</FONT></DIV>
<DIV Class="Examples"><TT>A : String(1 .. 31);<BR>
B : String(3 .. 33);<BR>
...</TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>26</FONT></DIV>
<DIV Class="Examples"><TT>A := B; --<I> same number of components</I></TT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>27</FONT></DIV>
<DIV Class="Examples"><TT>A(1 .. 9) := "tar sauce";<BR>
A(4 .. 12) := A(1 .. 9); --<I> A(1 .. 12) = "tartar sauce"</I></TT></DIV>
<DIV Class="NotesHeader"><FONT SIZE=-1>NOTES</FONT></DIV>
<DIV Class="Paranum"><FONT SIZE=-2>28</FONT></DIV>
<DIV Class="Notes"><FONT SIZE=-1>4 <I>Notes on the examples:</I>
<FONT FACE="Arial, Helvetica">Assignment_statement</FONT>s are allowed
even in the case of overlapping slices of the same array, because the
<I>variable_</I><FONT FACE="Arial, Helvetica">name</FONT> and <FONT FACE="Arial, Helvetica">expression</FONT>
are both evaluated before copying the value into the variable. In the
above example, an implementation yielding A(1 .. 12) = "tartartartar"
would be incorrect. </FONT></DIV>
<HR>
<P><A HREF="RM-TOC.html">Contents</A> <A HREF="RM-0-29.html">Index</A> <A HREF="RM-5-1.html">Previous</A> <A HREF="RM-5-3.html">Next</A> <A HREF="RM-TTL.html">Legal</A></P>
</BODY>
</HTML>
|