Содержание
| Предыдущая | Следующая
ГЛАВА 16
Определяющее присваивание
Каждая локальная переменная должна иметь
значение, сообщенное определяющим
присваиванием, когда происходит любой доступ
к этому значению. Доступ к ее значению состоит из
простого имени переменной, встречающейся
где-нибудь в выражении за исключением левого
операнда простого оператора присваивания =.
Транслятор Явы должен провести потоковый
анализ, чтобы удостовериться в том, что перед
каждым доступом к локальной переменной она имела
значение, сообщенное определяющим
присваиванием; иначе произойдет ошибка
трансляции.
Остальная часть от этой главы посвящена
точному объяснению слов "значение, сообщенное
определяющим присваиванием, перед". Идея
состоит в том, что присваивание локальной
переменной должно произойти,
независимо от пути, который
процесс проходит от начала конструктора, метода, или статического
инициализатора, который содержит доступ, до места присваивания.
Анализ принимает во внимание структуру
операторов и выражений; также он обеспечивает
специальную обработку выражений с операциями !, &&,
||, и ? :, операций &, |, ^, ==, и
!= с операндами типа
boolean, константными логическими
выражениями. Например, транслятор Явы распознает, что k имеет
значение, сообщенное определяющим
присваиванием, перед доступом (как параметр
вызова метода) в примере:
{
int k;
if (v > 0 && (k = System.in.read()) >= 0)
System.out.println(k);
}
потому, что доступ
происходит только если значение выражения:
v > 0 && (k = System.in.read()) >= 0
является истинным, а это значение может быть true только если присваивание k выполнено (более правильно,
вычислено). Аналогично, транслятор Явы
распознает что в примере:
{
int k;
while (true) {
k = n;
if (k >= 5) break;
n = 6;
}
System.out.println(k);
}
переменная k имеет определенное
оператором while значение, потому, что условное выражение true никогда не будет иметь значение false, таким образом,
только оператор break может
нормально завершить оператор while,
и k имеет значение, сообщенное
определяющим присваиванием, перед оператором break.
Кроме специальной обработки некоторых
логических операций и константных логических
выражений, значения выражений не
принимаются во внимание при потоковом анализе.
Например, транслятор Явы должен выдать ошибку во
время трансляции в примере:
{
int k;
int n = 5;
if (n > 2)
k = 3;
System.out.println(k); // k не имеет ”значение, сообщенное определяющим присваиванием, перед”
}
даже если значение n известно во
время трансляции, и в принципе может быть
известно во время трансляции, что присваивание k будет всегда выполняться (более
правильно, вычисляться). Транслятор Явы должен
действовать согласно правилам, приводящимся в
этом разделе. Правила распознают только
константные выражения; в этом примере, выражение n > 2 не является константным
выражением как определено в §15.27.
В качестве другой иллюстрации, транслятор Явы
принимает пример:
void flow(boolean flag) {
int k;
if (flag)
k = 3;
else
k = 4;
System.out.println(k);
}
какое бы значение, сообщенное определяющим
присваиванием, k не имело,
потому, что правила этой
главы разрешают говорить, что k
имеет значение независимо от того, является ли
флаг true или false. Но по этим правилам следующий
вариант неприемлем:
void flow(boolean flag) {
int k;
if (flag)
k = 3;
if (!flag)
k = 4;
System.out.println(k); // здесь k не имеет ”значение, сообщенное определяющим присваиванием, перед”
}
таким образом трансляция этой программы должна
выдать ошибку времени компиляции.
Чтобы точно определить все случаи
определенного присваивания, правила в этом
разделе выделяют два специальных термина:
- имеет ли локальная переменная значение, сообщенное
определяющим присваиванием, перед выражением
- имеет ли локальная переменная значение, сообщенное
определяющим присваиванием, после выражения.
Чтобы выделить логические выражения, последнее
понятие разделяется на два случая:
- имеет ли локальная переменная значение, сообщенное
определяющим присваиванием, после выражения когда
true, и
- имеет ли локальная переменная значение, сообщенное
определяющим присваиванием, после выражения когда
false
Здесь, когда true и когда
false относится к значению
выражения. Например, локальная переменная k имеет значение, сообщенное
определяющим присваиванием, после вычисления
выражения
a && ((k=m) > 5)
когда выражение true, но не
когда выражение false (потому что,
если a есть false, то присваивание k
не происходит (более правильно, не вычисляется)).
Утверждение "V имеет значение, сообщенное
определяющим присваиванием, после X" (где V
- локальная переменная, а X
– выражение) означает "V имеет значение,
сообщенное определяющим присваиванием, после X,
если X завершается нормально". Если X
завершается преждевременно, присваивание может
не произойти, и правила, установленные здесь, принимают это во внимание.
Специфическое следствие этого определения, что " V имеет значение,
сообщенное определяющим присваиванием, после break; " всегда является истиной! Так
как оператор break никогда не
завершается нормально, это бессмысленная истина,
что V присвоено значение, если оператор break завершается нормально.
Пусть V – локальная переменная. Пусть a, b, c, и e – выражения. Пусть S и T –
операторы.
V имеет значение, сообщенное определяющим
присваиванием, после любого константного
выражения, чье значение есть true, когда ложь. V имеет значение,
сообщенное определяющим присваиванием, после
любого константного выражения, чье значение есть
false, когда
истина.
Константное выражение, чье значение есть true, никогда не имеет значение false, и константное выражение, чье
значение есть false, никогда не
имеет значение true. Эти
определения полезны при анализе выражений,
включающих логические операторы &&,
||, и ! (§16.1.3, §16.1.4, §16.1.5).
Для каждого логического выражения:
- Если выражение не имеет никаких подвыражений,
то V имеет значение, сообщенное определяющим
присваиванием, после выражения, если и только
если V имеет значение, сообщенное
определяющим присваиванием, перед выражением.
Этот случай применяется к литералам и простым
именам.
- Иначе, V имеет значение, сообщенное
определяющим присваиванием, после выражения,
если и только если V имеет значение,
сообщенное определяющим присваиванием, после
выражения когда истина и V имеет значение,
сообщенное определяющим присваиванием, после
выражения когда ложь.
&&
- V имеет значение, сообщенное определяющим
присваиванием, после a && b
когда истина, если и только если V имеет
значение, сообщенное определяющим
присваиванием, после a когда
истина или V имеет значение, сообщенное
определяющим присваиванием, после b когда
истина.
- V имеет значение, сообщенное определяющим
присваиванием,, после a && b
когда ложь, если и только если V имеет
значение, сообщенное определяющим
присваиванием, после a когда
ложь и V имеет значение, сообщенное
определяющим присваиванием, после b когда ложь.
- V имеет значение, сообщенное определяющим
присваиванием, перед a,
если и только если V имеет значение,
сообщенное определяющим присваиванием, перед a && b.
- V имеет значение, сообщенное определяющим
присваиванием, перед b,
если и только если V имеет значение,
сообщенное определяющим присваиванием, после a когда истина.
||
- V имеет значение, сообщенное определяющим
присваиванием, после a || b когда
истина, если и только если V имеет значение,
сообщенное определяющим присваиванием, после a когда истина и V имеет
значение, сообщенное определяющим
присваиванием, после b
когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, после a || b, когда
ложь, если и только если V имеет значение,
сообщенное определяющим присваиванием, после a когда ложь или V имеет
значение, сообщенное определяющим
присваиванием, после b
когда ложь.
- V имеет значение, сообщенное определяющим
присваиванием, перед a, если
и только если V имеет значение, сообщенное
определяющим присваиванием, перед a || b.
- V имеет значение, сообщенное определяющим
присваиванием, перед b,
если и только если V имеет значение,
сообщенное определяющим присваиванием, после a когда ложь.
!
- V имеет значение, сообщенное определяющим
присваиванием, после !a когда истина, если и только
если V имеет значение, сообщенное
определяющим присваиванием, после a когда ложь.
- V имеет значение, сообщенное определяющим
присваиванием, после !a когда ложь, если и только
если V имеет значение, сообщенное
определяющим присваиванием, после a когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, перед a, если
и только если V имеет значение, сообщенное
определяющим присваиванием, перед !a .
&
- V имеет значение, сообщенное определяющим
присваиванием, после a & b когда
истина, если и только если V имеет значение,
сообщенное определяющим присваиванием, после a когда истина или V имеет
значение, сообщенное определяющим
присваиванием, после b
когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, после a & b когда
ложь, если и только если по крайней мере одно из
следующих утверждений истинно:
- V имеет значение, сообщенное определяющим
присваиванием, после b.
(Обратите внимание, что если V имеет
значение, сообщенное определяющим
присваиванием, после a,
следовательно, V имеет
значение, сообщенное определяющим
присваиванием, после b.)
- V имеет значение, сообщенное определяющим
присваиванием, после a
когда ложь и V имеет значение, сообщенное
определяющим присваиванием, после b когда ложь.
- V имеет значение, сообщенное определяющим
присваиванием, перед a,
если и только если V имеет значение,
сообщенное определяющим присваиванием, перед a & b.
- V имеет значение, сообщенное определяющим
присваиванием, перед b,
если и только если V имеет значение,
сообщенное определяющим присваиванием, после a.
|
- V имеет значение, сообщенное определяющим
присваиванием, после a | b когда
истина, если и только если по крайней мере одно из
следующих утверждений истинно:
- V имеет значение, сообщенное определяющим
присваиванием, после b.
(Обратите внимание, что если V имеет значение,
сообщенное определяющим присваиванием, после a, следовательно, V имеет
значение, сообщенное определяющим
присваиванием, после b.)
- V имеет значение, сообщенное определяющим
присваиванием, после a
когда истина и V имеет значение, сообщенное
определяющим присваиванием, после b когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, после a | b когда ложь,
если и только если V имеет значение,
сообщенное определяющим присваиванием, после a когда ложь или V имеет
значение, сообщенное определяющим
присваиванием, после b
когда ложь.
- V имеет значение, сообщенное определяющим
присваиванием, перед a,
если и только если V имеет значение,
сообщенное определяющим присваиванием, перед a | b.
- V имеет значение, сообщенное определяющим
присваиванием, перед b,
если и только если V имеет значение,
сообщенное определяющим присваиванием, после a.
^
- V имеет значение, сообщенное определяющим
присваиванием, после a ^ b когда
истина, если и только если по крайней мере одно из
следующих утверждений истинно:
- V имеет значение, сообщенное определяющим
присваиванием, после b.
- V имеет значение, сообщенное определяющим
присваиванием, после a
когда истина и V имеет значение, сообщенное
определяющим присваиванием, после b когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, после a
когда ложь и V имеет значение, сообщенное
определяющим присваиванием, после b когда ложь.
- V имеет значение, сообщенное определяющим
присваиванием, после a ^ b когда ложь,
если и только если по крайней мере одно из
следующих утверждений истинно:
- V имеет значение, сообщенное определяющим
присваиванием, после b.
- V имеет значение, сообщенное определяющим
присваиванием, после a
когда истина и V имеет значение, сообщенное
определяющим присваиванием, после b когда ложь.
- V имеет значение, сообщенное определяющим
присваиванием, после a
когда ложь и V имеет значение, сообщенное
определяющим присваиванием, после b когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, перед a,
если и только если V имеет значение,
сообщенное определяющим присваиванием, перед a ^ b.
- V имеет значение, сообщенное определяющим
присваиванием, перед b,
если и только если V имеет значение,
сообщенное определяющим присваиванием, после a.
==
- V имеет значение, сообщенное определяющим
присваиванием, после a == b когда
истина, если и только если по крайней мере одно из
следующих утверждений истинно:
- V имеет значение, сообщенное определяющим
присваиванием, после b.
- V имеет значение, сообщенное определяющим
присваиванием, после a
когда истина и V имеет значение, сообщенное
определяющим присваиванием, после b когда ложь.
- V имеет значение, сообщенное определяющим
присваиванием, после a
когда ложь и V имеет значение, сообщенное
определяющим присваиванием, после b когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, после a == b когда ложь,
если и только если по крайней мере одно из
следующих утверждений истинно:
- V имеет значение, сообщенное определяющим
присваиванием, после b.
- V имеет значение, сообщенное определяющим
присваиванием, после a
когда истина и V имеет значение, сообщенное
определяющим присваиванием, после b когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, после a
когда ложь и V имеет значение, сообщенное
определяющим присваиванием, после b когда ложь.
- V имеет значение, сообщенное определяющим
присваиванием, перед a,
если и только если V имеет значение,
сообщенное определяющим присваиванием, перед a == b.
- V имеет значение, сообщенное определяющим
присваиванием, перед b,
если и только если V имеет значение,
сообщенное определяющим присваиванием, после a.
!=
Правила для a !=
b идентичны правилам для a ^ b (§16.1.8).
?:
Предположим, что b и c
– логические выражения.
- V имеет значение, сообщенное определяющим
присваиванием, после a ? b :
c когда истина, если и только если оба
следующих утверждения истинны:
- V имеет значение, сообщенное определяющим
присваиванием, перед b или
V имеет значение, сообщенное определяющим
присваиванием, после b
когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, перед c или V имеет
значение, сообщенное определяющим
присваиванием, после c когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, после a ? b :
c когда ложь, если и только если оба следующих
утверждения истинны:
- V имеет значение, сообщенное определяющим
присваиванием, перед b или
V имеет значение, сообщенное определяющим
присваиванием, после b
когда ложь.
- V имеет значение, сообщенное определяющим
присваиванием, перед c или V имеет
значение, сообщенное определяющим
присваиванием, после c когда ложь.
- V имеет значение, сообщенное определяющим
присваиванием, перед a,
если и только если V имеет значение,
сообщенное определяющим присваиванием, перед a ? b : c.
- V имеет значение, сообщенное определяющим
присваиванием, перед b,
если и только если V имеет значение,
сообщенное определяющим присваиванием, после a когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, перед c, если и только если V
имеет значение, сообщенное определяющим
присваиванием, после a
когда ложь.
16.1.12 Условная операция
?:
Предположим, что b и c
– выражения, не являющиеся
логическими.
- V имеет значение, сообщенное определяющим
присваиванием, после a ? b : c, если и только если оба
следующих утверждения истинны:
- V имеет значение, сообщенное определяющим
присваиванием, после b.
- V имеет значение, сообщенное определяющим
присваиванием, после c.
- V имеет значение, сообщенное определяющим
присваиванием, перед a,
если и только если V имеет значение,
сообщенное определяющим присваиванием, перед a ? b : c.
- V имеет значение, сообщенное определяющим
присваиванием, перед b,
если и только если V имеет значение,
сообщенное определяющим присваиванием, после a когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, перед c, если и только если V
имеет значение, сообщенное определяющим
присваиванием, после a
когда ложь.
Предположим, что выражения присваивания a = b, a &= b, a |= b или a ^= b
логические.
- V имеет значение, сообщенное определяющим
присваиванием, перед a,
если и только если V имеет значение,
сообщенное определяющим присваиванием, перед
выражением присваивания.
- V имеет значение, сообщенное определяющим
присваиванием, перед b,
если и только если V имеет значение,
сообщенное определяющим присваиванием, после a.
- V имеет значение, сообщенное определяющим
присваиванием, после a = b когда
истина, если и только если или a
есть V или V имеет
значение, сообщенное определяющим
присваиванием, после правого операнда выражения
когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, после a = b когда
истина, если и только если или a
есть V или V имеет значение, сообщенное
определяющим присваиванием, после правого
операнда выражения когда ложь.
- V имеет значение, сообщенное определяющим
присваиванием, после a =& b когда
истина, если и только если или a
есть V или V имело бы значение,
сообщенное определяющим присваиванием, после a & b (в том же самом контексте)
когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, после a =& b когда
ложь, если и только если или a есть
V или V имело бы значение, сообщенное
определяющим присваиванием, после a & b (в том же самом контексте)
когда ложь.
- V имеет значение, сообщенное определяющим
присваиванием, после a |= b когда
истина, если и только если или a
есть V или V имело бы значение,
сообщенное определяющим присваиванием, после a | b (в том же самом контексте)
когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, после a |= b когда ложь,
если и только если или a есть
V или V имело бы значение, сообщенное
определяющим присваиванием, после a | b (в том же самом контексте)
когда ложь.
- V имеет значение, сообщенное определяющим
присваиванием, после a ^= b когда
истина, если и только если или a
есть V или V имело бы значение,
сообщенное определяющим присваиванием, после a ^ b (в том же самом контексте)
когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, после a ^= b когда ложь,
если и только если или a есть
V или V имело бы значение, сообщенное
определяющим присваиванием, после a ^ b (в том же самом контексте)
когда ложь.
Обратите внимание, что если a
есть V и V не имеет определенного
значения перед составным присваиванием типа a =& b, то обязательно произойдет
ошибка во время трансляции. Правила,
установленные выше включают отдельное "a есть V " таким образом, чтобы V рассматривалось как
имеющее значение, сообщенное определяющим
присваиванием в дальнейших пунктах кода.
Включение отдельного "a
есть V" не воздействует на решение
относительно того, является ли программа
допустимой или приведет к ошибке во время
трансляции, но это воздействует на то, сколько
различных пунктов в программе могут
рассматриваться как ошибочные, и это практически
может улучшить качество сообщения об ошибке.
Предположим, что выражения присваивания a = b, a += b, a –= b, a *= b, a /= b, a %= b, a <<= b, a >>= b, a >>>= b, a =& b, a |= b или a ^= b не
являются логическими.
- V имеет значение, сообщенное определяющим
присваиванием, после выражения присваивания,
если и только если или a есть
V или V имеет значение, сообщенное
определяющим присваиванием, после b.
- V имеет значение, сообщенное определяющим
присваиванием, перед a,
если и только если V имеет значение,
сообщенное определяющим присваиванием, перед
выражением присваивания.
- V имеет значение, сообщенное определяющим
присваиванием, перед b,
если и только если V имеет значение,
сообщенное определяющим присваиванием, после a.
++
и --
- V имеет значение, сообщенное определяющим
присваиванием, после выражения префиксного
инкремента, префиксного
декремента, постфиксного
инкремента, или постфиксного
декремента, если и только если или выражение
операнда есть V или V имеет значение,
сообщенное определяющим присваиванием, после
выражения операнда.
- V имеет значение, сообщенное определяющим
присваиванием, перед выражением операнда, если и
только если V имеет значение, сообщенное
определяющим присваиванием, перед выражением
префиксного инкремента, префиксного
декремента, постфиксного
инкремента, или постфиксного
декремента.
Если выражение не является логическим и не
является выражением условной операции или
выражением присваивания, то действуют следующие
правила:
- Если выражение не имеет никаких подвыражений,
то V имеет значение, сообщенное определяющим
присваиванием, после выражения, если и только
если V имеет значение, сообщенное
определяющим присваиванием, перед выражением.
Этот случай применяется к литералам, простым
именам, this, super, и null.
- Если выражение имеет подвыражения, то V
имеет значение, сообщенное определяющим
присваиванием, после выражения, если и только
если V имеет значение, сообщенное
определяющим присваиванием, после правого
крайнего непосредственного подвыражение.
Для любого непосредственного подвыражения y выражения x, V имеет
значение, сообщенное определяющим
присваиванием, перед y,
если и только если V имеет значение,
сообщенное определяющим присваиванием, перед x или одно из следующих
утверждений истинно:
- y есть правый операнд бинарной операции и V
имеет значение, сообщенное определяющим
присваиванием, после левого операнда.
- x есть ссылка на массив, y есть
подвыражение внутри скобок и V имеет
значение, сообщенное определяющим
присваиванием, после подвыражения перед
скобками.
- x есть выражение вызова метода для объекта; y
есть первое выражение параметра в выражении
вызова метода; имеется подвыражение, чье
значение есть объект слева от точки, имя метода, и
левая круглая скобка выражения вызова метода; и V
имеет значение, сообщенное определяющим
присваиванием, после этого подвыражения.
- x есть выражение вызова метода или выражение
создания экземпляра класса; y
есть выражение параметра, но не первое; и V
имеет значение, сообщенное определяющим
присваиванием, после выражения параметра слева
от y.
- x есть выражение создания экземпляра класса;
y есть выражение
размерности, но не первое; и V имеет значение,
сообщенное определяющим присваиванием, после
выражения размерности слева от y.
- V имеет значение, сообщенное определяющим
присваиванием, после пустого оператора, если и
только если оно имеет значение, сообщенное
определяющим присваиванием, перед пустым
оператором.
- V имеет значение, сообщенное определяющим
присваиванием, после пустого блока, если и только
если оно имеет значение, сообщенное определяющим
присваиванием, перед пустым блоком.
- V имеет значение, сообщенное определяющим
присваиванием, после непустого блока, если и
только если оно имеет значение, сообщенное
определяющим присваиванием, после последнего
оператора в блоке.
- V имеет значение, сообщенное определяющим
присваиванием, перед первым оператором блока,
если и только если оно имеет значение, сообщенное
определяющим присваиванием, перед блоком.
- V имеет значение, сообщенное определяющим
присваиванием, перед любым другим оператором S
блока, если и только если оно имеет значение,
сообщенное определяющим присваиванием, после
оператора, находящегося в блоке непосредственно
перед S.
- V имеет значение, сообщенное определяющим
присваиванием, после оператора объявления
локальной переменной, который не содержит
инициализаторов, если и только если оно имеет
значение, сообщенное определяющим
присваиванием, перед локальной переменной
оператора объявления.
- V имеет значение, сообщенное определяющим
присваиванием, после оператора объявления
локальной переменной, который содержит
инициализаторы, если и только если или оно имеет
значение, сообщенное определяющим
присваиванием, после последнего выражения
инициализатора в операторе объявления локальной
переменной или последнее выражение
инициализатора в объявлении находится в
операторе объявления, который объявляет V.
- V имеет значение, сообщенное определяющим
присваиванием, перед первым выражением
инициализатора, если и только если оно имеет
значение, сообщенное определяющим
присваиванием, перед локальной переменной
оператора объявления.
- V имеет значение, сообщенное определяющим
присваиванием, перед любым другим выражением
инициализатора e, если и только если или оно
имеет значение, сообщенное определяющим
присваиванием, после выражения инициализатора,
стоящим непосредственно перед e в операторе
объявления локальной переменной,
или выражение инициализатора, стоящее
непосредственно перед e в операторе
объявления локальной переменной,
находится в операторе объявления, который
объявляет V.
- V имеет значение, сообщенное определяющим
присваиванием, после помеченного оператора L
: S (где L – метка), если и только если V
имеет значение, сообщенное определяющим
присваиванием, после S и V имеет значение,
сообщенное определяющим присваиванием, перед
каждым оператором break,
который может завершить оператор с меткой L : S.
- V имеет значение, сообщенное определяющим
присваиванием, перед S, если и только если V
имеет значение, сообщенное определяющим
присваиванием, перед L : S.
- V имеет значение, сообщенное определяющим
присваиванием, после оператора-выражения e;,
если и только если оно имеет значение, сообщенное
определяющим присваиванием, после e.
- V имеет значение, сообщенное определяющим
присваиванием, перед e, если и только если оно
имеет значение, сообщенное определяющим
присваиванием, перед e;.
if
- V имеет значение, сообщенное определяющим
присваиванием, после if (e) S,
если и только если V имеет значение,
сообщенное определяющим присваиванием, после S
и V имеет значение, сообщенное определяющим
присваиванием, после e когда ложь.
- V имеет значение, сообщенное определяющим
присваиванием, перед e, если и только если V
имеет значение, сообщенное определяющим
присваиванием, перед if (e) S.
V имеет значение, сообщенное определяющим
присваиванием, перед S, если и только если V
имеет значение, сообщенное определяющим
присваиванием, после e когда истина.
- V имеет значение, сообщенное определяющим
присваиванием, после if (e) S
else T, если и только если V
имеет значение, сообщенное определяющим
присваиванием, после S и V имеет значение,
сообщенное определяющим присваиванием, после T.
- V имеет значение, сообщенное определяющим
присваиванием, перед e, если и только если V
имеет значение, сообщенное определяющим
присваиванием, перед if (e) S
else T. V имеет значение,
сообщенное определяющим присваиванием, перед S,
если и только если V имеет значение,
сообщенное определяющим присваиванием, после e
когда истина. V имеет значение, сообщенное
определяющим присваиванием, перед T, если и
только если V имеет значение, сообщенное
определяющим присваиванием, после e когда
ложь.
switch
- V имеет значение, сообщенное определяющим
присваиванием, после оператора switch,
если и только если оба из следующих утверждений
истинны:
- Или switch блок
пуст, или V имеет значение,
сообщенное определяющим присваиванием, после
последнего оператора switch блока.
- V имеет значение, сообщенное определяющим
присваиванием, перед каждым оператором break, который
может завершать оператор switch.
- V имеет значение, сообщенное определяющим
присваиванием, перед выражением переключателя,
если и только если V имеет значение,
сообщенное определяющим присваиванием, перед
оператором switch.
- V имеет значение, сообщенное определяющим
присваиванием, перед оператором или оператором
объявления локальной переменной S в блоке
переключателя, если и только если по крайней мере
одно из следующих утверждений истинно:
- V имеет значение, сообщенное определяющим
присваиванием, после выражения переключателя.
- S не помечен меткой case или default и V имеет значение,
сообщенное определяющим присваиванием, после
предшествующего оператора.
while
- V имеет значение, сообщенное определяющим
присваиванием, после while (e) S,
если и только если V имеет значение,
сообщенное определяющим присваиванием, после e
когда ложь и V имеет значение, сообщенное
определяющим присваиванием, перед каждым
оператором break, который
может завершать оператор while.
- V имеет значение, сообщенное определяющим
присваиванием, перед e, если и только если V
имеет значение, сообщенное определяющим
присваиванием, перед оператором while.
- V имеет значение, сообщенное определяющим
присваиванием, перед S, если и только если V
имеет значение, сообщенное определяющим
присваиванием, после e когда истина.
do
- V имеет значение, сообщенное определяющим
присваиванием, после do S while (e);, если и только если V
имеет значение, сообщенное определяющим
присваиванием, после e когда ложь и V имеет
значение, сообщенное определяющим
присваиванием, перед каждым оператором break, который
может завершать оператор do.
- V имеет значение, сообщенное определяющим
присваиванием, перед S, если и только если V
имеет значение, сообщенное определяющим
присваиванием, перед оператором do.
- V имеет значение, сообщенное определяющим
присваиванием, перед e, если и только если V
имеет значение, сообщенное определяющим
присваиванием, после S и V имеет значение,
сообщенное определяющим присваиванием, перед
каждым оператором continue,
который может завершать тело оператора do.
for
- V имеет значение, сообщенное определяющим
присваиванием, после оператора for,
если и только если оба из следующих утверждений
истинны:
- Или условного выражения не существует или V
имеет значение, сообщенное определяющим
присваиванием, после условного выражения когда
ложь.
- V имеет значение, сообщенное определяющим
присваиванием, перед каждым оператором break, который
может завершать оператор for.
- V имеет значение, сообщенное определяющим
присваиванием, перед частью инициализации
оператора for, если и только если V
имеет значение, сообщенное определяющим
присваиванием, перед оператором for.
- V имеет значение, сообщенное определяющим
присваиванием, перед условной частью оператора for, если и только если V имеет
значение, сообщенное определяющим
присваиванием, после части инициализации
оператора for.
- V имеет значение, сообщенное определяющим
присваиванием, перед вложенным оператором, если
и только если любое из следующих утверждений
истинно:
- Условное выражение существует и V имеет
значение, сообщенное определяющим
присваиванием, после условного выражения когда
истина.
- Выражение условия не существует и V имеет
значение, сообщенное определяющим
присваиванием, после части инициализации
оператора for.
- V имеет значение, сообщенное определяющим
присваиванием, перед частью приращения
оператора for, если и только если V
имеет значение, сообщенное определяющим
присваиванием, после вложенного оператора и V
имеет значение, сообщенное определяющим
присваиванием, перед каждым оператором continue, который может завершать
тело оператора for.
- Если часть инициализации оператора for
есть оператор объявления локальной переменной,
то применяются правила §16.2.3.
- Иначе, если часть инициализации пуста, то V
имеет значение, сообщенное определяющим
присваиванием, после части инициализации, если и
только если V имеет значение, сообщенное
определяющим присваиванием, перед частью
инициализации.
- Иначе, применяются три правила:
- V имеет значение, сообщенное определяющим
присваиванием, после части инициализации, если и
только если V имеет значение, сообщенное
определяющим присваиванием, после последнего
оператора выражения в части инициализации.
- V имеет значение, сообщенное определяющим
присваиванием, перед первым оператором
выражения в части инициализации, если и только
если V имеет значение, сообщенное
определяющим присваиванием, перед частью
инициализации.
- V имеет значение, сообщенное определяющим
присваиванием, перед оператором выражения E, отличного от первого, в части инициализации, если и
только если V имеет значение, сообщенное
определяющим присваиванием, после оператора
выражения, стоящего непосредственно перед E.
- Если часть приращения оператор for
пуста, то V имеет значение, сообщенное
определяющим присваиванием, после части
приращения, если и только если V имеет
значение, сообщенное определяющим
присваиванием, перед частью приращения.
- Иначе применяются три правила:
- V имеет значение, сообщенное определяющим
присваиванием, после части приращения, если и
только если V имеет значение, сообщенное
определяющим присваиванием, после последнего
оператора-выражения в части приращения.
- V имеет значение, сообщенное определяющим
присваиванием, перед первым
оператором-выражением в части приращения, если и
только если V имеет значение, сообщенное
определяющим присваиванием, перед частью
приращения.
- V имеет значение, сообщенное определяющим
присваиванием, перед оператором-выражением E, отличного от первого, в части приращения, если и
только если V имеет значение, сообщенное
определяющим присваиванием, после
оператора-выражения, стоящего непосредственно
перед E.
break, continue, return и throw
- Обычно мы говорим, что V имеет значение,
сообщенное определяющим присваиванием, после
любого оператора break, continue,
return и throw.
Утверждение, что переменная "имеет значение,
сообщенное определяющим присваиванием, после"
оператора или выражения в действительности
означает "имеет значение, сообщенное
определяющим присваиванием, после того, как
оператор или выражение завершается
нормально". Так, как
операторы break, continue,
return и throw никогда
не завершаются нормально, то они
безусловно удовлетворяют этому утверждению.
- В операторе return с выражением или
операторе throw V имеет значение,
сообщенное определяющим присваиванием, перед
выражением, если и только если V имеет
значение, сообщенное определяющим
присваиванием, перед оператором return или throw.
synchronized
- V имеет значение, сообщенное определяющим
присваиванием, после synchronized (e)
S, если и только если V имеет значение,
сообщенное определяющим присваиванием, после S.
- V имеет значение, сообщенное определяющим
присваиванием, перед e, если и только если V
имеет значение, сообщенное определяющим
присваиванием, перед оператором synchronized
(e) S.
- V имеет значение, сообщенное определяющим
присваиванием, перед S, если и только если V
имеет значение, сообщенное определяющим
присваиванием, после e.
try
- V имеет значение, сообщенное определяющим
присваиванием, после оператора try,
если и только если одно из следующих утверждений
истинно:
- V имеет значение, сообщенное определяющим
присваиванием, после блока try и V имеет значение,
сообщенное определяющим присваиванием, после
каждого блока catch в операторе try.
- Оператор try имеет блок finally и V имеет значение,
сообщенное определяющим присваиванием, после
блока finally.
- V имеет значение, сообщенное определяющим
присваиванием, перед try блоком, если и только если V имеет
значение, сообщенное определяющим
присваиванием, перед оператором try.
- V имеет значение, сообщенное определяющим
присваиванием, перед catch блоком, если и только если V
имеет значение, сообщенное определяющим
присваиванием, перед оператором try.
V имеет значение, сообщенное определяющим
присваиванием, перед блоком finally, если и только если V имеет
значение, сообщенное определяющим
присваиванием, перед оператором try.
Содержание
| Предыдущая | Следующая