A = B+C; A,B = B*C; /*A and B will each have the value of B*C */ X(K) = 5; P->NODE.VALUE = SQRT(X(J)); SUBSTR(S,I,J) = 'ABC';
配列代入の場合、各 target 変数が配列でなければなりません。右辺には、配列式または要素式を指定できます。右辺に配列が含まれている場合は、形状が target 配列と同一でなければなりません。
構造体代入の場合、各 target 変数が構造体でなければなりません。右辺には、構造体式または要素式を指定できます。右辺に構造体が含まれている場合は、形状が target 構造体と同一でなければなりません。
target および expression は不特定の順序で評価されるため、評価中に呼び出される関数や ON-unit が副作用 (target 参照で使用されている添え字またはポインターへの代入や、target の記憶域の解放など) の影響を受ける可能性があります。同様に、expression の評価中に呼び出される関数や ON-unit の実行によって target の記憶域が解放されないようにする必要があります。
評価の順序に依存するプログラムは、PL/I の別の実装に移すと失敗することがあります。
説明
代入文は、expression を評価して、その値を指定された変数に代入します。
代入文は、target 参照および expression を不特定の順序で評価し、expression の値を各 target のデータ型に変換して、各 target に (左から右の順序で) 順番に代入します。データ型の変換の規則については、「データ型変換」の章を参照してください。
代入先の target がビット文字列または文字列で、変換されたソース値より短い場合は、ソース値の右端のビットまたは文字が切り捨てられます。
代入先の target が非可変長の文字列である場合は、変換されたソース値の右側が空白文字で埋められて、target と同じ長さになります。
代入先の target が可変長の文字列である場合は、target の長さが、新たに代入された値の現在の長さになります。
代入先の target がビット文字列である場合は、ソース値の右側がゼロ ビットで埋められて、target と同じ長さになります。
expression の値は複数の target に代入できます。BY NAME オプションを使用した構造体代入の場合、そのような複数の代入が適用されるのは、文の両側のすべての構造体で共通の名前を持つ基本項目だけです。
構造体代入で BY NAME オプションを使用すると、expression で指定した構造体内の項目のうち、target に含まれる項目と共通の名前を持つ項目の値のみを target 構造体に代入できます。BY NAME オプションは、右辺に少なくとも 1 つの構造体が含まれている場合にのみ使用できます。そのような場合、BY NAME の構造体代入は一連のスカラー代入または配列代入と同等となり、target 構造体のメンバー (スカラーまたは配列) のうち次の条件が当てはまるメンバーごとにそのような代入が生成されます。その条件とは、右辺で参照されているすべての構造体に対応するメンバー (スカラーまたは配列) があり、その完全な構造体名 (最上位の構造体名を除く) が自身の完全な構造体名 (最上位の構造体名を除く) と同一である、というものです。これらの個別の代入は、target 構造体内のメンバー (スカラーまたは配列) の順序で生成されます。次に例を示します。
この代入は、次の一連の代入と同等です。