?: - оператор Элвис - знали ли вы?
От: Shmj Ниоткуда  
Дата: 01.01.25 10:19
Оценка: 2 (2) -1
Оказывается:

https://en.wikipedia.org/wiki/Elvis_operator

Это аналог C#-овского ??

Назван в честь шевелюры Элвиса Пресли.
Re: ?: - оператор Элвис - знали ли вы?
От: Свободу Анжеле Девис и Юрию Деточкину СССР  
Дата: 01.01.25 11:34
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Оказывается:


S>https://en.wikipedia.org/wiki/Elvis_operator


S>Это аналог C#-овского ??


S>Назван в честь шевелюры Элвиса Пресли.


не надоело плодить бессмысленные темы?
Нет времени на раскачку!
Re[2]: ?: - оператор Элвис - знали ли вы?
От: Shmj Ниоткуда  
Дата: 01.01.25 11:51
Оценка: +1
Здравствуйте, Свободу Анжеле Девис и Юрию Деточкину, Вы писали:

САД>не надоело плодить бессмысленные темы?


А ты что уже можешь сказать в чем смысл и что соответствует этому смыслу а что нет?
Re: ?: - оператор Элвис - знали ли вы?
От: graniar  
Дата: 01.01.25 12:58
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>https://en.wikipedia.org/wiki/Elvis_operator


Не знал, что он так называется, но как-то прожил до сих пор без этого знания
Re: ?: - оператор Элвис - знали ли вы?
От: пффф  
Дата: 01.01.25 16:31
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Оказывается:


S>https://en.wikipedia.org/wiki/Elvis_operator


Знали, и что?


S>Это аналог C#-овского ??


Понятия не имею, C# последний раз 20 лет назад трогал
Re[2]: ?: - оператор Элвис - знали ли вы?
От: velkin Удмуртия https://kisa.biz
Дата: 01.01.25 16:32
Оценка: :)
Здравствуйте, graniar, Вы писали:

S>>https://en.wikipedia.org/wiki/Elvis_operator

G>Не знал, что он так называется, но как-то прожил до сих пор без этого знания

А прикинь, он так и не называется.

Ternary conditional operator
Тернарная условная операция

И в серьёзных книгах вроде Страуструпа такого треша нет, там так и пишут тернарная условная операция.

Правым операндом у этих операций является имя, а не значение, и обеспечивают они базовое средство доступа к членам. Возможность перегрузки этих операций привела бы к очень тонким ошибкам [Stroustrup, 1994]. Тернарная условная операция ?: (§6.3.2) также запрещена к перегрузке. Также нельзя перегружать именованные операции sizeof (§4.6) и typeid (§15.4.4).


Кстати, White Power.

«White power» (с англ. — «белая сила») — движение «белых» расистов, объединяющее белых сепаратистов, сторонников превосходства «белой расы», белых националистов.

А ты знал, что знак OK рукой это главный жест позволящий определить своего от чужого. Давайте придумаем больше трешака. Например, радугу присвоили себе ЛГБТ.

А ты знал? А ТЫ ЗнАЛ? а тЫ зНал?

Вот оно что Михалыч.



Re[3]: ?: - оператор Элвис - знали ли вы?
От: Shmj Ниоткуда  
Дата: 01.01.25 17:36
Оценка:
Здравствуйте, velkin, Вы писали:

V>А прикинь, он так и не называется.


V>Ternary conditional operator

V>Тернарная условная операция

V>И в серьёзных книгах вроде Страуструпа такого треша нет, там так и пишут тернарная условная операция.


Вы что не переходили по ссылке? Тернарный оператор — это другое.

Тернарный оператор:

int result = (a > b) ? a : b;


Оператор Элвис:

val result = user.name ?: "Unknown"
Re[4]: ?: - оператор Элвис - знали ли вы?
От: graniar  
Дата: 01.01.25 19:11
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Вы что не переходили по ссылке? Тернарный оператор — это другое.


А я переходил мельком, и понял так, что речь о тернарном операторе
Ну такой себе, не настолько важный, чтоб изменять привычкам. Сейчас много всякого наплодилось, я это все игнорю, пока не требуется в чужом коде разбираться.
Re[5]: ?: - оператор Элвис - знали ли вы?
От: Shmj Ниоткуда  
Дата: 01.01.25 19:12
Оценка:
Здравствуйте, graniar, Вы писали:

G>А я переходил мельком, и понял так, что речь о тернарном операторе


Я же написал, аналог C#-ового оператора ?? Это не вопрос — это утверждение.
Re[4]: ?: - оператор Элвис - знали ли вы?
От: velkin Удмуртия https://kisa.biz
Дата: 01.01.25 19:59
Оценка: 1 (1)
Здравствуйте, Shmj, Вы писали:

S>Вы что не переходили по ссылке? Тернарный оператор — это другое.

S>Тернарный оператор:
S>
S>int result = (a > b) ? a : b;
S>

S>Оператор Элвис:
S>
S>val result = user.name ?: "Unknown"
S>

Давай перейдём и посмотрим.

Нотация оператора Элвиса была вдохновлена ​​тернарным условным оператором, ? :, поскольку выражение оператора Элвиса A ?: B приблизительно эквивалентно тернарному условному выражению A ? A : B.
...
Булев вариант
На языке, поддерживающем оператор Элвиса, что-то вроде этого:
x = f() ?: g()
установит x равным результату , f() если этот результат истинен, и результату в g()противном случае.

Это эквивалентно следующему примеру, использующему условный тернарный оператор:
x = f() ? f() : g()
за исключением того, что он не оценивается f() дважды, если дает истину. Обратите внимание на возможность произвольного поведения, если f() это не функция, независимая от состояния, которая всегда возвращает один и тот же результат.
...
В GNU C и C++ (то есть в C и C++ с расширениями GCC ) второй операнд тернарного оператора является необязательным. Так было по крайней мере с версии GCC 2.95.3 (март 2001 г.), и, по-видимому, это изначальный оператор Элвиса.
...
В C# оператор null-conditional называется ?. "оператором Элвиса", но он не выполняет ту же функцию. Вместо этого ее выполняет оператор null-coalescing ??.


Ладно давай просто проверим на GCC C++, то есть g++.
#include <iostream>

int main()
{
    int a = 5, b = 3;
    int min = (a < b) ? a : b;
    int max = (a > b) ? a : b;
    std::cout << "min = " << min << std::endl;
    std::cout << "max = " << max << std::endl;
    
    // elvis ???
    int min1 = (a < b) ?: b;
    int max1 = (a > b) ?: b;
    // warning: the omitted middle operand in ?: will always be 'true',
    // suggest explicit middle operand
    std::cout << "min1 = " << min1 << std::endl;
    // warning: the omitted middle operand in ?: will always be 'true',
    // suggest explicit middle operand
    std::cout << "max1 = " << max1 << std::endl;
    
    // reverse elvis ???
    // error: expected primary-expression before ';' token
    //int min2 = (a < b) ? a :;
    // error: expected primary-expression before ';' token
    //int max2 = (a > b) ? a :;
}


Вывод.
min = 3
max = 5
min1 = 3
max1 = 1


Я сократил переведённую справку "элвиса" до C++ и C#, но вообще.

В GNU C и C++ (то есть в C и C++ с расширениями GCC) второй операнд тернарного оператора является необязательным. Так было по крайней мере с версии GCC 2.95.3 (март 2001 г.), и, по-видимому, это изначальный оператор Элвиса.

В Apache Groovy «оператор Элвиса» ?: документирован как отдельный оператор; эта функция была добавлена ​​в Groovy 1.5 (декабрь 2007 г.). Groovy, в отличие от GNU C и PHP, не ?: позволяет просто опускать второй операнд тернарного оператора ; вместо этого двоичный оператор ?: должен быть записан как один оператор без пробелов между ними.

В PHP можно опустить среднюю часть тернарного оператора, начиная с версии PHP 5.3. (июнь 2009 г.).
В языке программирования Fantom есть ?: бинарный оператор, который сравнивает свой первый операнд с null.

В Kotlin оператор Elvis возвращает свою левую часть, если она не равна нулю, и свою правую часть в противном случае. Распространенным шаблоном является использование его с return, например: val foo = bar() ?: return

В Gosu оператор ?: возвращает правый операнд, если левый также равен нулю.

В C# оператор null-conditional называется ?. "оператором Элвиса", но он не выполняет ту же функцию. Вместо этого ее выполняет оператор null-coalescing ??.

В ColdFusion и CFML оператор Элвиса был введен с использованием ?: синтаксиса.

В языке программирования Xtend есть оператор Элвиса.

В шаблонах закрытия Google оператор Элвиса является нулевым объединяющим оператором , эквивалентным isNonnull($a) ? $a : $b.

В Ballerina оператор Elvis L ?: R возвращает значение, L если оно не равно нулю. В противном случае возвращает значение R.

В JavaScript оператор объединения nullish (??) является логическим оператором, который возвращает свой правый операнд, если его левый операнд равен null или undefined, а в противном случае возвращает свой левый операнд.


Получается изначально взяли тернарную условную операцию, сократили со значением по умолчанию, но под сокращением каждый новый язык программирования стал понимать нечто своё. И это нас так же подводит к Null coalescing operator. А этот Элвис может быть чем угодно, главное чтобы знаки совпадали ?: или даже не совпадали.

Примерно понятно, что в C и C++ это тернарная (синонимы: тринарная, троичная, трёхчленная) условная операция, но каждый создатель нового языка потом додумал нечто своё, если не задать в ней второй аргумент из трёх и в принципе что с чем сравнивать в условии, то есть в первом аргументе. При этом в C++ как я сейчас проверил можно не задать второй член, но не третий.

Это мне напоминает "И одним лёгким движением руки тернарная условная операция превращается, превращается, в ...". А во что угодно, главное чтобы был ?: или не был. Как-то всё это не надёжно, хотя может на частной тусовке смузи программистов и прокатит.
Re[5]: ?: - оператор Элвис - знали ли вы?
От: Shmj Ниоткуда  
Дата: 02.01.25 08:17
Оценка:
Здравствуйте, velkin, Вы писали:

V>Получается изначально взяли тернарную условную операцию, сократили со значением по умолчанию, но под сокращением каждый новый язык программирования стал понимать нечто своё. И это нас так же подводит к Null coalescing operator. А этот Элвис может быть чем угодно, главное чтобы знаки совпадали ?: или даже не совпадали.


Ну это уже экскурс в историю — ономасиология. Сейчас это совершенно разные операторы.

Это как слово плотник и плот. Плотъ «ограда, плетень», оплотъ «ограда, стена, забор; предел». Но сейчас плот и плотник никак не связаны, плотник это не тот кто делает плоты.
Re[2]: ?: - оператор Элвис - знали ли вы?
От: sergii.p  
Дата: 02.01.25 11:41
Оценка:
Здравствуйте, graniar, Вы писали:

G>Не знал, что он так называется, но как-то прожил до сих пор без этого знания


это до того момента, пока на собеседовании не спросят. Меня как-то спросили лет 10 назад. Теперь знаю, но собес я тогда не прошёл — типа не осилил терминологию.
Re: - знали ли вы? -да, знал.
От: Wolverrum Ниоткуда  
Дата: 02.01.25 15:43
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Назван в честь шевелюры Элвиса Пресли.

Еще когда с groovy разбиларся
Re: ?: - оператор Элвис - знали ли вы?
От: 777777w Россия  
Дата: 04.01.25 06:36
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Это аналог C#-овского ??


Аналог не может появиться раньше оригинала.
Re: ?: - оператор Элвис - знали ли вы?
От: LaptevVV Россия  
Дата: 04.01.25 06:54
Оценка: -1 :)
S>Это аналог C#-овского ??
Это додиезный — аналог Сишного.
S>Назван в честь шевелюры Элвиса Пресли.
И кто это его так назвал ?
Деннис Ричи, или Кен Томпсон ?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: ?: - оператор Элвис - знали ли вы?
От: LaptevVV Россия  
Дата: 04.01.25 06:56
Оценка: +1 -1 :)
G>>Не знал, что он так называется, но как-то прожил до сих пор без этого знания
SP>это до того момента, пока на собеседовании не спросят. Меня как-то спросили лет 10 назад. Теперь знаю, но собес я тогда не прошёл — типа не осилил терминологию.
И слава Богу!
С такими дебилами связываться — нафиг надо !
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[5]: ?: - оператор Элвис - знали ли вы?
От: graniar  
Дата: 04.01.25 09:41
Оценка:
Здравствуйте, velkin, Вы писали:

V>Давай перейдём и посмотрим.

V>...

Велкин, как всегда, основателен до умопомрачения

V>Это мне напоминает "И одним лёгким движением руки тернарная условная операция превращается, превращается, в ...". А во что угодно, главное чтобы был ?: или не был. Как-то всё это не надёжно, хотя может на частной тусовке смузи программистов и прокатит.


+1

Я б на их месте наоборот, запретил в новом стандарте C++ пропускать операнд, во избежание ошибок при портировании или в силу привычки на другом языке.
Отредактировано 04.01.2025 9:47 graniar . Предыдущая версия . Еще …
Отредактировано 04.01.2025 9:47 graniar . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.