Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

Всем привет!

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

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

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

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

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

Код:
int a = 42;
Console.WriteLine((a = 43));
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.06.2018, 15:17   #3
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

В 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 в 20:42.
Вадим Мошев вне форума Ответить с цитированием
Старый 21.06.2018, 15:34   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

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

И да, в JS кстати может показаться, что
Код:
var a = b = 42;
эквивалентно
Код:
var a = 42;
var b = 42;
но на самом деле нет.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

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

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
в итоге приведёт к тому, что значение principal будут иметь как HttpContext.Current.User, так и Thread.CurrentPrincipal
Спасибо!
dream555 вне форума Ответить с цитированием
Старый 21.06.2018, 16:30   #6
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Сообщение от 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, 16:38   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

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

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

В C#, С++ и т.п. такой проблемы естественно нет потому что там нельзя случайно создать переменную так.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 21.06.2018 в 16:43.
Alex11223 вне форума Ответить с цитированием
Старый 21.06.2018, 16:53   #8
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

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


Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Инструкция (statement) создания переменной с var примерно так:
"var" IDENTIFIER ["=" expression]
поэтому второму var неоткуда взяться (в expression'ах его нет).
В expression'ах var и не может находиться.
Тем не менее, согласно тому, как работает в консоли выражение
Код:
var a = b = 42;
, переменные a и b корректно объявляются и инициализируются значением 42
Вадим Мошев вне форума Ответить с цитированием
Старый 21.06.2018, 17:08   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Код:
(function() {
    var a = b = 42;
})();
console.log(b);
console.log(a);
Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
В expression'ах var и не может находиться.
я имел в виду описание грамматики языка (BNF и т.п.)
Код:
expression = 
    IDENTIFIER |
    expression "*" expression |
    expression "+" expression |
    IDENTIFIER "=" expression |
    ...
И то, что инструкции объявления переменной пофиг что там за выражение справа, оно не ищет там переменные.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 21.06.2018 в 17:21.
Alex11223 вне форума Ответить с цитированием
Старый 21.06.2018, 17:40   #10
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

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

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal. Арифметическое выражение. Решить квадратное уравнение и посчитать выражение, используя вычисленные корни. dauletsergazin Паскаль, Turbo Pascal, PascalABC.NET 4 13.11.2017 11: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