Простые выражения присваивания
Для выражения expr в форме w = expr-rhs:
· состояние определенного присваивания переменной v перед выражением expr-rhs соответствует состоянию определенного присваивания переменной v перед выражением expr.
· если переменная w является той же самой переменной, что и переменная v, переменная v после выражения expr является определенно присвоенной. В противном случае состояние определенного присваивания переменной v после выражения expr соответствует состоянию определенного присваивания переменной v после выражения expr-rhs.
5.3.3.24 Выражения &&
Для выражения expr в форме expr-first && expr-second:
· состояние определенного присваивания переменной v перед выражением expr-first соответствует состоянию определенного присваивания переменной v перед выражением expr;
· переменная v перед выражением expr-second является определенно присвоенной, если состояние переменной v после выражения expr-first является определенно присвоенным или "определенно присвоенным в результате выполнения выражения с итогом true". В обратном случае она не является определенно присвоенной;
· состояние определенного присваивания переменной v после выражения expr определяется следующими правилами:
o если выражение expr-first является константным выражением, имеющим значение false, состояние определенного присваивания переменной v после выражения expr соответствует состоянию определенного присваивания переменной v после выражения expr-first;
o в противном случае, если переменная v после выражения expr-first является определенно присвоенной, переменная v после выражения expr является определенно присвоенной;
o в противном случае, если состояние переменной v после выражения expr-second является определенно присвоенным, а состояние переменной v после выражения expr-first соответствует состоянию "определенно присвоенная в результате выполнения выражения с итогом false", переменная v после выражения expr является определенно присвоенной;
o в противном случае, если переменная v после выражения expr-second является определенно присвоенной или "определенно присвоенной в результате выполнения выражения с итогом true", переменная v после выражения expr является "определенно присвоенной в результате выполнения выражения с итогом true";
o в противном случае, если переменная v после выражения expr-first имеет состояние "определенно присвоенная в результате выполнения выражения с итогом false", а после выражения expr-second переменная v имеет состояние "определенно присвоенная в результате выполнения выражения с итогом false", то после выражения expr переменная v имеет состояние "определенно присвоенная в результате выражения с итогом false";
o в противном случае переменная v после выражения expr не является определенно присвоенной.
В этом примере
class A
{
static void F(int x, int y) {
int i;
if (x >= 0 && (i = y) >= 0) {
// i definitely assigned
}
else {
// i not definitely assigned
}
// i not definitely assigned
}
}
переменная i считается определенно присвоенной только в одном из внедренных операторов оператора if. В операторе if в методе F переменная i является определенно присвоенной в первом внедренном операторе, поскольку выполнение выражения (i = y) всегда предшествует выполнению этого внедренного оператора. Наоборот, переменная i не является определенно присвоенной во втором внедренном операторе, поскольку проверка условия x >= 0 может завершиться с итогом false, в результате чего для переменной i не будет выполнено присваивание.
5.3.3.25 Выражения ||
Для выражения expr в форме expr-first || expr-second:
· состояние определенного присваивания переменной v перед выражением expr-first соответствует состоянию определенного присваивания переменной v перед выражением expr;
· переменная v перед выражением expr-second является определенно присвоенной, если состояние переменной v после выражения expr-first является определенно присвоенным или "определенно присвоенным в результате выполнения выражения с итогом false". В обратном случае она не является определенно присвоенной;
· состояние определенного присваивания переменной v после выражения expr определяется следующими факторами:
o если выражение expr-first является константным выражением, имеющим значение true, состояние определенного присваивания переменной v после выражения expr соответствует состоянию определенного присваивания переменной v после выражения expr-first;
o в противном случае, если переменная v после выражения expr-first является определенно присвоенной, переменная v после выражения expr является определенно присвоенной;
o в противном случае, если состояние переменной v после выражения expr-second является определенно присвоенным, а состояние переменной v после выражения expr-first соответствует состоянию "определенно присвоенная в результате выполнения выражения с итогом true", переменная v после выражения expr является определенно присвоенной;
o в обратном случае, если переменная v после выражения expr-second является определенно присвоенной или "определенно присвоенной в результате выполнения выражения с итогом false", переменная v после выражения expr является "определенно присвоенной в результате выполнения выражения с итогом false";
o в обратном случае, если переменная v после выражения expr-first имеет состояние "определенно присвоенная в результате выполнения выражения с итогом true", а после выражения expr-second имеет переменная v состояние "определенно присвоенная в результате выполнения выражения с итогом true", переменная v после выражения expr имеет состояние "определенно присвоенная в результате выражения с итогом true";
o в противном случае переменная v после выражения expr не является определенно присвоенной.
В этом примере
class A
{
static void G(int x, int y) {
int i;
if (x >= 0 || (i = y) >= 0) {
// i not definitely assigned
}
else {
// i definitely assigned
}
// i not definitely assigned
}
}
переменная i считается определенно присвоенной только в одном из внедренных операторов оператора if. В операторе if в методе G переменная i является определенно присвоенной во втором внедренном операторе, поскольку выполнение выражения (i = y) всегда предшествует выполнению этого внедренного оператора. Наоборот, переменная i не является определенно присвоенной в первом внедренном операторе, поскольку проверка условия x >= 0 может завершиться с итогом true, в результате чего переменной i не будет выполнено присваивание.
5.3.3.26 ! выражения
Для выражения expr в форме ! expr-operand:
· состояние определенного присваивания переменной v перед выражением expr-operand соответствует состоянию определенного присваивания переменной v перед выражением expr.
· состояние определенного присваивания переменной v после выражения expr определяется следующими правилами:
o если переменная v после выражения expr-operand является определенно присвоенной, переменная v после выражения expr также является определенно присвоенной;
o если переменная v после выражения expr-operand не является определенно присвоенной, переменная v после выражения expr также не является определенно присвоенной;
o если переменная v после выражения expr-operand имеет состояние "определенно присвоенная в результате выполнения выражения с итогом false", переменная v после выражения expr имеет состояние "определенно присвоенная в результате выполнения выражения с итогом true";
o если переменная v после выражения expr-operand имеет состояние "определенно присвоенная в результате выполнения выражения с итогом true", переменная v после выражения expr имеет состояние "определенно присвоенная в результате выполнения выражения с итогом false".
Выражения ??
Для выражения expr в форме expr-first?? expr-second:
· состояние определенного присваивания переменной v перед выражением expr-first соответствует состоянию определенного присваивания переменной v перед выражением expr;
· состояние определенного присваивания переменной v перед выражением expr-second соответствует состоянию определенного присваивания переменной v после выражения expr-first.
· состояние определенного присваивания переменной v после выражения expr определяется следующими факторами:
o если выражение expr-first является константным выражением (§7.19), имеющим значение NULL, состояние переменной v после выражения expr соответствует состоянию переменной v после выражения expr-second;
· В обратном случае состояние переменной v после выражения expr соответствует состоянию определенного присваивания переменной v после выражения expr-first.
5.3.3.28 Выражения ?:
Для выражения expr в форме expr-cond ? expr-true : expr-false:
· состояние определенного присваивания переменной v перед выражением expr-cond соответствует состоянию переменной v перед выражением expr;
· Переменная v перед выражением expr-true считается определенно присвоенной только при соблюдении одного из следующих условий:
o выражение expr-cond является константным выражением со значением false;
o переменная v после выражения expr-cond является определенно присвоенной или "определенно присвоенной в результате выполнения выражения с результатом true";
· Переменная v перед выражением expr-false считается определенно присвоенной только при соблюдении одного из следующих условий:
o expr-cond является константным выражением, имеющим значение true
· переменная v после выражения expr-cond является определенно присвоенной или "определенно присвоенной в результате выполнения выражения с результатом false";
· состояние определенного присваивания переменной v после выражения expr определяется следующими правилами:
o если выражение expr-cond является константным выражением (§7.19), имеющим значение true, состояние переменной v после выражения expr соответствует состоянию переменной v после выражения expr-true;
o в обратном случае, если выражение expr-cond является константным выражением (§7.19), имеющим значение false, состояние переменной v после выражения expr соответствует состоянию переменной v после выражения expr-false;
o в обратном случае, если переменная v является определенно присвоенной после выражения expr-true, а также переменная v является определенной присвоенной после выражения expr-false, переменная v после выражения expr также является определенно присвоенной;
o в противном случае переменная v после выражения expr не является определенно присвоенной.
Анонимные функции
Для лямбда-выражений или выражений анонимного метода expr с телом body, содержащим блок или выражение:
· Состояние определенного присваивания внешней переменной v перед телом body соответствует состоянию переменной v перед выражением expr. Таким образом, состояние определенного присваивания внешних переменных наследуется из контекста анонимной функции.
· Состояние определенного присваивания внешней переменной v после выражения expr соответствует состоянию переменной v перед выражением expr.
Пример:
delegate bool Filter(int i);
void F() {
int max;
// Error, max is not definitely assigned
Filter f = (int n) => n < max;
max = 5;
DoWork(f);
}
приводит к возникновению ошибки времени компиляции, поскольку переменная max не является определенно присвоенной при объявлении анонимной функции. Пример:
delegate void D();
void F() {
int n;
D d = () => { n = 1; };
d();
// Error, n is not definitely assigned
Console.WriteLine(n);
}
также приводит к возникновению ошибки времени компилирования, поскольку присваивание для переменной n в анонимной функции не влияет на состояние определенного присваивания переменной n вне анонимной функции.
Ссылочные переменные
Ссылка на переменную представляет собой выражение, которое классифицируется как переменная. Ссылка на переменную указывает место хранения, к которому можно получить доступ как для извлечения текущего значения, так и для сохранения нового значения.
variable-reference:
expression
В C и C++ ссылка на переменную называется lvalue.