Простые выражения присваивания

Для выражения 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.

Наши рекомендации