|
CHAPTER 16: Definite Assignment |
|
 Previous |
 Java Language |
 Index |
 Next |
16.1 Definite Assignment and Expressions
16.1.1 Boolean Constant Expressions
, 16.1.2 Boolean-valued Expressions
, 16.1.3 The Boolean Operator &&
, 16.1.4 The Boolean Operator ||
, 16.1.5 The Boolean Operator !
, 16.1.6 The Boolean Operator &
, 16.1.7 The Boolean Operator |
, 16.1.8 The Boolean Operator ^
, 16.1.9 The Boolean Operator ==
, 16.1.10 The Boolean Operator !=
, 16.1.11 The Boolean Operator ? :
, 16.1.12 The Conditional Operator ? :
, 16.1.13 Boolean Assignment Expressions
, 16.1.14 Other Assignment Expressions
, 16.1.15 Operators ++ and --
, 16.1.16 Other Expressions
V is definitely assigned after any constant expression whose value is true
when false. V is definitely assigned after any constant expression whose value is false
when true.
A constant expression whose value is true
never has the value false
, and a constant expression whose value is false
never has the value true
, these definitions are vacuously satisfied. They are helpful in analyzing expressions involving the boolean operators &&
, ||
, and ! (
S16.1.3, S16.1.4, S16.1.5).
For every boolean-valued expression:
- If the expression has no subexpressions, V is definitely assigned after the expression iff V is definitely assigned before the expression. This case applies to literals and simple names.
- Otherwise, V is definitely assigned after the expression iff V is definitely assigned after the expression when true and V is definitely assigned after the expression when false.
- V is definitely assigned after a &&
b when true iff V is definitely assigned after a when true or V is definitely assigned after b when true.
- V is definitely assigned after a &&
b when false iff V is definitely assigned after a when false and V is definitely assigned after b when false.
- V is definitely assigned before a iff V is definitely assigned before a &&
b.
- V is definitely assigned before b iff V is definitely assigned after a when true.
- V is definitely assigned after a ||
b when true iff V is definitely assigned after a when true and V is definitely assigned after b when true.
- V is definitely assigned after a ||
b when false iff V is definitely assigned after a when false or V is definitely assigned after b when false.
- V is definitely assigned before a iff V is definitely assigned before a ||
b.
- V is definitely assigned before b iff V is definitely assigned after a when false.
- V is definitely assigned after !
a when true iff V is definitely assigned after a when false.
- V is definitely assigned after !
a when false iff V is definitely assigned after a when true.
- V is definitely assigned before a iff V is definitely assigned before !
a.
- V is definitely assigned after a &
b when true iff V is definitely assigned after a when true or V is definitely assigned after b when true.
- V is definitely assigned after a &
b when false iff at least one of the following is true:
- V is definitely assigned after b. (Note that if V is definitely assigned after a, it follows that V is definitely assigned after b.)
- V is definitely assigned after a when false and V is definitely assigned after b when false.
- V is definitely assigned before a iff V is definitely assigned before a &
b.
- V is definitely assigned before b iff V is definitely assigned after a.
- V is definitely assigned after a |
b when true iff at least one of the following is true:
- V is definitely assigned after b. (Note that if V is definitely assigned after a, it follows that V is definitely assigned after b.)
- V is definitely assigned after a when true and V is definitely assigned after b when true.
- V is definitely assigned after a |
b when false iff V is definitely assigned after a when false or V is definitely assigned after b when false.
- V is definitely assigned before a iff V is definitely assigned before a |
b.
- V is definitely assigned before b iff V is definitely assigned after a.
- V is definitely assigned after a ^
b when true iff at least one of the following is true:
- V is definitely assigned after b.
- V is definitely assigned after a when true and V is definitely assigned after b when true.
- V is definitely assigned after a when false and V is definitely assigned after b when false.
- V is definitely assigned after a ^
b when false iff at least one of the following is true:
- V is definitely assigned after b.
- V is definitely assigned after a when true and V is definitely assigned after b when false.
- V is definitely assigned after a when false and V is definitely assigned after b when true.
- V is definitely assigned before a iff V is definitely assigned before a ^
b.
- V is definitely assigned before b iff V is definitely assigned after a.
- V is definitely assigned after a ==
b when true iff at least one of the following is true:
- V is definitely assigned after b.
- V is definitely assigned after a when true and V is definitely assigned after b when false.
- V is definitely assigned after a when false and V is definitely assigned after b when true.
- V is definitely assigned after a ==
b when false iff at least one of the following is true:
- V is definitely assigned after b.
- V is definitely assigned after a when true and V is definitely assigned after b when true.
- V is definitely assigned after a when false and V is definitely assigned after b when false.
- V is definitely assigned before a iff V is definitely assigned before a ==
b.
- V is definitely assigned before b iff V is definitely assigned after a.
The rules for a !=
b are identical to the rules for a ^
b (S16.1.8).
Suppose that b and c are boolean-valued expressions.
- V is definitely assigned after a ?
b :
c when true iff both of the following are true:
- V is definitely assigned before b or V is definitely assigned after b when true.
- V is definitely assigned before c or V is definitely assigned after c when true.
- V is definitely assigned after a ?
b :
c when false iff both of the following are true:
- V is definitely assigned before b or V is definitely assigned after b when false.
- V is definitely assigned before c or V is definitely assigned after c when false.
- V is definitely assigned before a iff V is definitely assigned before a ?
b :
c.
- V is definitely assigned before b iff V is definitely assigned after a when true.
- V is definitely assigned before c iff V is definitely assigned after a when false.
Suppose that b and c are expressions that are not boolean-valued.
- V is definitely assigned after a ?
b :
c iff both of the following are true:
- V is definitely assigned after b.
- V is definitely assigned after c.
- V is definitely assigned before a iff V is definitely assigned before a ?
b :
c.
- V is definitely assigned before b iff V is definitely assigned after a when true.
- V is definitely assigned before c iff V is definitely assigned after a when false.
Suppose that an assignment expression a =
b, a &=
b, a |=
b, or a ^=
b is boolean- valued.
- V is definitely assigned before a iff V is definitely assigned before the assignment expression.
- V is definitely assigned before b iff V is definitely assigned after a.
- V is definitely assigned after a =
b when true iff either a is V or V is definitely assigned after the right-hand operand expression when true.
- V is definitely assigned after a =
b when false iff either a is V or V is definitely assigned after the right-hand operand expression when false.
- V is definitely assigned after a &=
b when true iff either a is V or V would be definitely assigned after a &
b (in the same context) when true.
- V is definitely assigned after a &=
b when false iff either a is V or V would be definitely assigned after a &
b (in the same context) when false.
- V is definitely assigned after a |=
b when true iff either a is V or V would be definitely assigned after a |
b (in the same context) when true.
- V is definitely assigned after a |=
b when false iff either a is V or V would be definitely assigned after a |
b (in the same context) when false.
- V is definitely assigned after a ^=
b when true iff either a is V or V would be definitely assigned after a ^
b (in the same context) when true.
- V is definitely assigned after a ^=
b when false iff either a is V or V would be definitely assigned after a ^
b (in the same context) when false.
Note that if a is V and V is not definitely assigned before a compound assignment such as a &=
b, then a compile-time error will necessarily occur. The rules stated above include the disjunct "a is V" so that V will be considered to have been definitely assigned at later points in the code. Including the disjunct "a is V" does not affect the binary decision as to whether a program is acceptable or will result in a compile-time error, but it affects how many different points in the code may be regarded as erroneous, and so in practice it can improve the quality of error reporting.
Suppose that an assignment expression a =
b, a +=
b, a -=
b, a *=
b, a /=
b, a %=
b, a <<=
b, a >>=
b, a >>>=
b, a &=
b, a |=
b, or a ^=
b is not boolean-valued.
- V is definitely assigned after the assignment expression iff either a is V or V is definitely assigned after b.
- V is definitely assigned before a iff V is definitely assigned before the assignment expression.
- V is definitely assigned before b iff V is definitely assigned after a.
- V is definitely assigned after a preincrement, predecrement, postincrement, or postdecrement expression iff either the operand expression is V or V is definitely assigned after the operand expression.
- V is definitely assigned before the operand expression iff V is definitely assigned before the preincrement, predecrement, postincrement, or postdecrement expression.
If an expression is not boolean-valued and is not a conditional-operator expression or assignment expression, the following rules apply:
- If the expression has no subexpressions, V is definitely assigned after the expression iff V is definitely assigned before the expression. This case applies to literals, simple names, this
, super
, and null
.
- If the expression has subexpressions, V is definitely assigned after the expression iff V is definitely assigned after its rightmost immediate subexpression.
For any immediate subexpression y of an expression x, V is definitely assigned before y iff V is definitely assigned before x or one of the following situations is true:
- y is the right-hand operand of a binary operator and V is definitely assigned after the left-hand operand.
- x is an array reference, y is the subexpression within the brackets, and V is definitely assigned after the subexpression before the brackets.
- x is a method invocation expression for an object; y is the first argument expression in the method invocation expression; there is a subexpression whose value is an object to the left of the dot, method name, and left parenthesis of the method invocation expression; and V is definitely assigned after this subexpression.
- x is a method invocation expression or class instance creation expression; y is an argument expression, but not the first; and V is definitely assigned after the argument expression to the left of y.
- x is an class instance creation expression; y is a dimension expression, but not the first; and V is definitely assigned after the dimension expression to the left of y.
 | © 1996 Sun Microsystems, Inc. All rights reserved. |