Простые выражения присваивания — КиберПедия 

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

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

2017-10-16 223
Простые выражения присваивания 0.00 из 5.00 0 оценок
Заказать работу

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


Поделиться с друзьями:

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.02 с.