代入

目的

指定された 1 つ以上の変数に値を代入します。

構文

target[,targetn]… =expression[,BY NAME];

パラメーター:

target(s)
変数参照または疑似変数。
expression
任意の有効な式。

説明

代入文は、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 構造体内のメンバー (スカラーまたは配列) の順序で生成されます。次に例を示します。

DECLARE 1 STRUC1, 
   2 A … ,
   2 B,
      3 M … ,
      3 N … ,
      3 O … ,
   2 C … ,
   2 D … ;

DECLARE 1 STRUC2,
   5 C … ,
   5 D … ,
   5 B,
      10 L … ,
      10 M … ,
      10 O … ;

DECLARE 1 STRUC3, 
   2 A … ,
   2 D … ,
   2 C … ,
   2 E,
      3 M … ,
      3 N … ,
      3 O … ,
   2B,
      3 M … ,
      3 N … ;

STRUC1 = STRUC2 + STRUC3, BY NAME;

この代入は、次の一連の代入と同等です。

STRUC1.B.M = STRUC2.B.M + STRUC3.B.M; 
STRUC1.C = STRUC2.C + STRUC3.C; 
STRUC1.D = STRUC2.D + STRUC3.D;
注: BYNAME を BY NAME の同意語として使用できます。

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 の別の実装に移すと失敗することがあります。