Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Технологии > Общие вопросы по программированию, компьютерным наукам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 21.06.2018, 15:35   #1
dream555
Новичок
 
Регистрация: 21.06.2018
Сообщений: 2
Репутация: 10
По умолчанию Странное выражение, два =

Всем привет!

Тут ковырял чужой код и обратил внимание на следующее:

Thread.CurrentPrincipal = HttpContext.Current.User = principal;

Меня объекты не интересуют. Как понимать два знака равно?
dream555 вне форума   Ответить с цитированием
Старый 21.06.2018, 16:07   #2
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,332
Репутация: 3200

icq: 512-765
skype: alexp.frl
По умолчанию

Верно замечено, что "=" это выражение (expression), а не инструкция (statement).

И как и все выражения оно что-то возвращает...

Код:

int a = 42;
Console.WriteLine((a = 43));

Alex11223 на форуме   Ответить с цитированием
Старый 21.06.2018, 16:17   #3
Вадим Мошев
гигаМодератор :)
Заслуженный модератор
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Адрес: Адрес: Адрес: Адрес: Адрес: Адрес: Адрес: Адрес: Адрес:
Сообщений: 7,489
Репутация: 3678
По умолчанию

В JS оператор "=" присваивает правой части значение левой части (описка: наоборот, конечно же) (в случае элементарных типов) и возвращает значение левой части. Этот оператор правоассоциативен, то есть, выполняется справа налево, то есть, если таких операторов несколько, выполнение будет происходить начиная с самого правого.
В выражении
Код:

Thread.CurrentPrincipal = HttpContext.Current.User = principal;

сначала будет выполнено
Код:

HttpContext.Current.User = principal

, затем
Код:

Thread.CurrentPrincipal = HttpContext.Current.User

, что в итоге приведёт к тому, что значение principal будут иметь как HttpContext.Current.User, так и Thread.CurrentPrincipal

Последний раз редактировалось Вадим Мошев; 21.06.2018 в 21:42.
Вадим Мошев вне форума   Ответить с цитированием
Старый 21.06.2018, 16:34   #4
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,332
Репутация: 3200

icq: 512-765
skype: alexp.frl
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
присваивает правой части значение левой части
да ну?
42 = a?
Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
в случае элементарных типов
да причем тут типы?

a = (b * 2);
a = b++;
a = ++b;
a = f(f2(b));
не вызывает же вопросов, вот и с выражением = так же.

И да, в JS кстати может показаться, что
Код:

var a = b = 42;

эквивалентно
Код:

var a = 42;
var b = 42;

но на самом деле нет.

Последний раз редактировалось Alex11223; 21.06.2018 в 16:41.
Alex11223 на форуме   Ответить с цитированием
Старый 21.06.2018, 17:00   #5
dream555
Новичок
 
Регистрация: 21.06.2018
Сообщений: 2
Репутация: 10
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
в итоге приведёт к тому, что значение principal будут иметь как HttpContext.Current.User, так и Thread.CurrentPrincipal
Спасибо!
dream555 вне форума   Ответить с цитированием
Старый 21.06.2018, 17:30   #6
Вадим Мошев
гигаМодератор :)
Заслуженный модератор
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Адрес: Адрес: Адрес: Адрес: Адрес: Адрес: Адрес: Адрес: Адрес:
Сообщений: 7,489
Репутация: 3678
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
42 = a?
А так разве можно делать? Я вообще-то подразумевал, что слева должна стоять переменная.


Цитата:
Сообщение от Alex11223 Посмотреть сообщение
да причем тут типы?
Я имел в виду, что если речь идёт об объектах, то присваивается не значение, а ссылка, так как передача объектов происходит по ссылке, а не по значению.


Цитата:
Сообщение от Alex11223 Посмотреть сообщение
И да, в JS кстати может показаться, что

Код:

var a = b = 42;

эквивалентно

Код:

var a = 42;
var b = 42;

но на самом деле нет.
Только что выполнил в консоли
Код:

var a = b = 42;

и все переменные приняли значение 42.
Я понимаю, согласно тому, как работает оператор присваивания, это будет эквивалентно
Код:

var a = 42;
var b = a;

Что в конечном итоге приведёт к тому, что все переменные будут иметь значение 42.
Вадим Мошев вне форума   Ответить с цитированием
Старый 21.06.2018, 17:38   #7
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,332
Репутация: 3200

icq: 512-765
skype: alexp.frl
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
А так разве можно делать?
ну так я и говорю, что не левая правой.
Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
и все переменные приняли значение 42.
разница в var/области видимости.

Инструкция (statement) создания переменной с var выглядит примерно так:
"var" IDENTIFIER ["=" expression]
поэтому второму var неоткуда взяться (в expression'ах его нет).

В C#, С++ и т.п. такой проблемы естественно нет потому что там нельзя случайно создать переменную так.

Последний раз редактировалось Alex11223; 21.06.2018 в 17:43.
Alex11223 на форуме   Ответить с цитированием
Старый 21.06.2018, 17:53   #8
Вадим Мошев
гигаМодератор :)
Заслуженный модератор
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Адрес: Адрес: Адрес: Адрес: Адрес: Адрес: Адрес: Адрес: Адрес:
Сообщений: 7,489
Репутация: 3678
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
ну так я и говорю, что не левая правой.
Я просто опечатался. Перепутал "лево" и "право" местами.


Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Инструкция (statement) создания переменной с var примерно так:
"var" IDENTIFIER ["=" expression]
поэтому второму var неоткуда взяться (в expression'ах его нет).
В expression'ах var и не может находиться.
Тем не менее, согласно тому, как работает в консоли выражение
Код:

var a = b = 42;

, переменные a и b корректно объявляются и инициализируются значением 42
Вадим Мошев вне форума   Ответить с цитированием
Старый 21.06.2018, 18:08   #9
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,332
Репутация: 3200

icq: 512-765
skype: alexp.frl
По умолчанию

Код:

(function() {
    var a = b = 42;
})();
console.log(b);
console.log(a);

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
В expression'ах var и не может находиться.
я имел в виду описание грамматики языка (BNF и т.п.)
Код:

expression = 
    IDENTIFIER |
    expression "*" expression |
    expression "+" expression |
    IDENTIFIER "=" expression |
    ...

И то, что инструкции объявления переменной пофиг что там за выражение справа, оно не ищет там переменные.

Последний раз редактировалось Alex11223; 21.06.2018 в 18:21.
Alex11223 на форуме   Ответить с цитированием
Старый 21.06.2018, 18:40   #10
Вадим Мошев
гигаМодератор :)
Заслуженный модератор
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Адрес: Адрес: Адрес: Адрес: Адрес: Адрес: Адрес: Адрес: Адрес:
Сообщений: 7,489
Репутация: 3678
По умолчанию

Я вообще подразумевал, что операции происходят в одной области видимости. Я считаю, что неявного объявления переменных (как здесь произошло) следует избегать, так как это приведёт к созданию глобальных переменных или затиранию существующего в данной области видимости значения этой переменной.

Да, про эквивалентность я был не прав. В данном случае, переменная a будет локальной для функции, и за её пределами будет не видна. Для определения переменной b не было инструкции var, это и есть неявное определение переменной. Такая переменная, как я говорил, будет определена глобально.
Вадим Мошев вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal. Арифметическое выражение. Решить квадратное уравнение и посчитать выражение, используя вычисленные корни. dauletsergazin Паскаль 4 13.11.2017 12:55
Два листа - два события, одновременность срабатывания двух макросов strannick Microsoft Office Excel 20 03.04.2012 16:49
Два одномерных массива A и B. Сформировать два новых массива. Паскаль. Где ошибка в коде? Tomny Помощь студентам 1 27.03.2011 16:47
Че-то странное .... ~Brilliant~ Безопасность, Шифрование 9 27.04.2009 13:57
два TMediaPlayer и два AVI-файла zeleniy Компоненты Delphi 0 01.06.2007 14:14


11:40.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru