Внезапно, ||= и &&=
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 08.08.25 21:07
Оценка: :))) :)
Здравствуйте!

Обнаружил, что таких операторов в плюсах нет

Интересно, а с чего?
Маньяк Робокряк колесит по городу
Re: Внезапно, ||= и &&=
От: rg45 СССР  
Дата: 09.08.25 06:25
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте!

M>Обнаружил, что таких операторов в плюсах нет
M>Интересно, а с чего?

Ну, наверное потому, что у всех булевских операторов типы операндов могут быть очень многообразны, а тип результата всегда строго bool. Ну, например, каким должен быть результат оператора &&= для двух операндов типа int? Вот чтобы избежать всяких подобных вопросов, эти операторы и не стали вводить.

А ещё нет булевского XOR. Наверное потому, что для операндов булевского типа его результат всегда совпадает с результатом оператора !=, а для операндов других типов опять возникают всякие неудобные вопросики.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 09.08.2025 7:27 rg45 . Предыдущая версия . Еще …
Отредактировано 09.08.2025 6:56 rg45 . Предыдущая версия .
Отредактировано 09.08.2025 6:42 rg45 . Предыдущая версия .
Отредактировано 09.08.2025 6:29 rg45 . Предыдущая версия .
Re[2]: Внезапно, ||= и &&=
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 09.08.25 08:07
Оценка:
Здравствуйте, rg45, Вы писали:


R>А ещё нет булевского XOR. Наверное потому, что для операндов булевского типа его результат всегда совпадает с результатом оператора !=, а для операндов других типов опять возникают всякие неудобные вопросики.


Да, тут у меня тоже возник вопрос — битовый XOR по приоритету между OR и AND, а логический XOR, который не равно, имеет приоритет выше AND
Маньяк Робокряк колесит по городу
Re[2]: Внезапно, ||= и &&=
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 09.08.25 08:11
Оценка:
Здравствуйте, rg45, Вы писали:

R>Ну, наверное потому, что у всех булевских операторов типы операндов могут быть очень многообразны, а тип результата всегда строго bool. Ну, например, каким должен быть результат оператора &&= для двух операндов типа int? Вот чтобы избежать всяких подобных вопросов, эти операторы и не стали вводить.


Кстати, а почему ты считаешь, что результат должен быть строго типа bool? Для || и && такого требования нет
Маньяк Робокряк колесит по городу
Re[3]: Внезапно, ||= и &&=
От: rg45 СССР  
Дата: 09.08.25 09:43
Оценка: +1
Здравствуйте, Marty, Вы писали:

M>Кстати, а почему ты считаешь, что результат должен быть строго типа bool? Для || и && такого требования нет


Как это нет? И какой, по-твоему, тип результата, кроме bool, может быть, например, у выражения 42 && 43? int, что ли?

Результатом всех булевских операций является либо true, либо false и третьего не дано. И true, и false оба имеют тип bool.

7.6.14 Logical AND operator

1 The && operator groups left-to-right. The operands are both contextually converted to bool ([conv]). The result is true if both operands are true and false otherwise. Unlike &, && guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false.

2 The result is a bool. If the second expression is evaluated, the first expression is sequenced before the second expression ([intro.execution]).


7.6.15 Logical OR operator

1 The || operator groups left-to-right. The operands are both contextually converted to bool ([conv]). The result is true if either of its operands is true, and false otherwise. Unlike |, || guarantees left-to-right evaluation; moreover, the second operand is not evaluated if the first operand evaluates to true.

2 The result is a bool. If the second expression is evaluated, the first expression is sequenced before the second expression ([intro.execution]).

--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 09.08.2025 10:01 rg45 . Предыдущая версия . Еще …
Отредактировано 09.08.2025 9:49 rg45 . Предыдущая версия .
Отредактировано 09.08.2025 9:48 rg45 . Предыдущая версия .
Отредактировано 09.08.2025 9:44 rg45 . Предыдущая версия .
Re[2]: Внезапно, ||= и &&=
От: Pzz Россия https://github.com/alexpevzner
Дата: 09.08.25 10:40
Оценка: +1 :)
Здравствуйте, rg45, Вы писали:

R>Ну, наверное потому, что у всех булевских операторов типы операндов могут быть очень многообразны, а тип результата всегда строго bool. Ну, например, каким должен быть результат оператора &&= для двух операндов типа int? Вот чтобы избежать всяких подобных вопросов, эти операторы и не стали вводить.


Таким же, как a = a && b; Со всем связанным с этим комплексом неудобных вопросов.

Но судя по тому, что Марти обнаружил отсутствие операторов &&= и ||= где-то, насколько я понимаю, примерно на сороковом году жизни, наверное они и вправду бывают нечасто нужны.
Re[3]: Внезапно, ||= и &&=
От: Pzz Россия https://github.com/alexpevzner
Дата: 09.08.25 10:41
Оценка:
Здравствуйте, Marty, Вы писали:

M>Кстати, а почему ты считаешь, что результат должен быть строго типа bool? Для || и && такого требования нет


&& и || выдают на выходе bool, при необходимости привода значения своих операндов к булевскому типу.
Re: Внезапно, ||= и &&=
От: Pzz Россия https://github.com/alexpevzner
Дата: 09.08.25 10:42
Оценка:
Здравствуйте, Marty, Вы писали:

M>Обнаружил, что таких операторов в плюсах нет


M>Интересно, а с чего?


Сколько ты перед тем написал плюсового кода, не зная, что таких операторов в плюсах нет? Наверное, их нет потому, что они не слишком нужны.
Re[3]: Внезапно, ||= и &&=
От: Pzz Россия https://github.com/alexpevzner
Дата: 09.08.25 10:45
Оценка:
Здравствуйте, Marty, Вы писали:

M>Да, тут у меня тоже возник вопрос — битовый XOR по приоритету между OR и AND, а логический XOR, который не равно, имеет приоритет выше AND


Более смешно то, что в разных языках, произошедших от Си, по-разному расставлены приоритеты похожих операций.
Re[3]: Внезапно, ||= и &&=
От: rg45 СССР  
Дата: 09.08.25 10:47
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Таким же, как a = a && b; Со всем связанным с этим комплексом неудобных вопросов.


Pzz>Но судя по тому, что Марти обнаружил отсутствие операторов &&= и ||= где-то, насколько я понимаю, примерно на сороковом году жизни, наверное они и вправду бывают нечасто нужны.


Ну да, непротиворечивые правила можно было бы придумать. Тем не менее, всё равно существовала бы другая чаша весов, на которой находился бы принцип наименьшего удивления. И эта другая чаша оказывается несколько тяжелее, чем в случае других операторов.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 09.08.2025 10:49 rg45 . Предыдущая версия . Еще …
Отредактировано 09.08.2025 10:47 rg45 . Предыдущая версия .
Re[2]: Внезапно, ||= и &&=
От: Нomunculus Россия  
Дата: 09.08.25 10:48
Оценка: 2 (1) :)
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Marty, Вы писали:


M>>Обнаружил, что таких операторов в плюсах нет


M>>Интересно, а с чего?


Pzz>Сколько ты перед тем написал плюсового кода, не зная, что таких операторов в плюсах нет? Наверное, их нет потому, что они не слишком нужны.


Зато есть офигеть какой нужный spaceship — <=>
Re[4]: Внезапно, ||= и &&=
От: Pzz Россия https://github.com/alexpevzner
Дата: 09.08.25 10:52
Оценка:
Здравствуйте, rg45, Вы писали:

Pzz>>Но судя по тому, что Марти обнаружил отсутствие операторов &&= и ||= где-то, насколько я понимаю, примерно на сороковом году жизни, наверное они и вправду бывают нечасто нужны.


R>Ну да, непротиворечивые правила можно было бы придумать. Тем не менее, всё равно существовала бы другая чаша весов, на которой находился бы принцип наименьшего удивления.


Мне нравится подход Go. Там нет автоматического приведения целочисленных типов.

Даже вот такая конструкция:

type int Oranges
type int Apples
type int Fruits

var o Oranges
var a Apples
var f Ftuits

f = o + a


Вызовет ошибку времени компиляции при попытке сложить яблоки с апельсинами без явного приведения типов.

Хотя все три типа определены через int, это три разных типа (но приводимых друг к другу).
Re[5]: Внезапно, ||= и &&=
От: rg45 СССР  
Дата: 09.08.25 10:56
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>
Pzz>type int Oranges
Pzz>type int Apples
Pzz>type int Fruits

Pzz>var o Oranges
Pzz>var a Apples
Pzz>var f Ftuits

Pzz>f = o + a
Pzz>


Pzz>Вызовет ошибку времени компиляции при попытке сложить яблоки с апельсинами без явного приведения типов.


Ну тут палка о двух концах. Ровно с тем же успехом она не позволит выполнить и вполне осмысленное действие, например, разделить километры на часы. В С++, конечно, приходится делать больше телодвижений, но полнота контроля получается больше. А тут получается по принципу: "делай, что тебе говорят и будь счастлив".
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: Внезапно, ||= и &&=
От: Pzz Россия https://github.com/alexpevzner
Дата: 09.08.25 10:58
Оценка: :)
Здравствуйте, Нomunculus, Вы писали:

Pzz>>Сколько ты перед тем написал плюсового кода, не зная, что таких операторов в плюсах нет? Наверное, их нет потому, что они не слишком нужны.


Н>Зато есть офигеть какой нужный spaceship — <=>


Пипец какой. Я не знал.

В принципе, идею понять можно.

  if (a < b)
    return -1;
  if (a > b)
    return 1;
  returm 0;


Выглядит как-то несимметрично. И такое сравнение с тремя вариантами ответов — это одна ассемблерная команда для целочисленных типов (и еще одна-две, чтобы нормализовать результат). И такое сравнение очень часто встречается.

Но заводить для него еще один мутный оператор...

А почему нет оператора, который возвращает за раз частное и остаток от деления? Тоже тот случай, когда результат даёт одна ассемблерная команда, а по-сишному надо писать две строки (которые развернутся в две одинаковые команды, если компилятор достаточно наивен).
Re[6]: Внезапно, ||= и &&=
От: Pzz Россия https://github.com/alexpevzner
Дата: 09.08.25 11:07
Оценка:
Здравствуйте, rg45, Вы писали:

Pzz>>Вызовет ошибку времени компиляции при попытке сложить яблоки с апельсинами без явного приведения типов.


R>Ну тут палка о двух концах. Ровно с тем же успехом она не позволит выполнить и вполне осмысленное действие, например, разделить километры на часы. В С++, конечно, приходится делать больше телодвижений, но полнота контроля получается больше. А тут получается по принципу: "делай, что тебе говорят и будь счастлив".


Можно явно привести.

Альфа бы, конечно, сказал, что он умный и никогда не будет складывать яблоки с апельсинами, и ему лишний контроль не нужен.

Но бывает так, что работаешь, например, со сложной иерархией структур, и в них есть битовые поля, и в разных структурах они разные (с разным назначением битов). Ну, к примеру, иерархия дескрипторов USB. В Configuration Descriptor у поля bMAttributes свои биты, в Endpoint Descriptor — свои, а поля одинаково называются. Немудрено и напутать.

А если обозвать их разными типами, то (1) не перепутаешь (2) не надо даже как-то в комментариях особо выделять, какие биты к чему относятся, это выражено в самом коде.

Но так да. Если делишь километры на часы, придется сказать компилятору, что ты понимаешь, что делаешь.
Re[3]: Внезапно, ||= и &&=
От: rg45 СССР  
Дата: 09.08.25 11:14
Оценка: +4
Здравствуйте, Нomunculus, Вы писали:

Н>Зато есть офигеть какой нужный spaceship — <=>


Офигенная штука, на самом деле.

В очень большом спектре сценариев в классе достаточно написать всего пару строчек:

struct A {

   // . . . Members . . .

   bool operator == (const A&) const = default;
   auto operator <=> (const A&) const = default;
};


и у тебя готов класс с полным набором всевозможных операторов сравнения: ==, !=, <=>, <, <=, >, >=.
--
Справедливость выше закона. А человечность выше справедливости.
Re[7]: Внезапно, ||= и &&=
От: rg45 СССР  
Дата: 09.08.25 11:18
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Можно явно привести.


Ну вот этого как раз и не хотелось бы. Это примерно то же самое, как при работе с типизированными указателями на каждый чих приходилось бы приводить их к void*.

Pzz>Альфа бы, конечно, сказал, что он умный и никогда не будет складывать яблоки с апельсинами, и ему лишний контроль не нужен.


Pzz>Но бывает так, что работаешь, например, со сложной иерархией структур, и в них есть битовые поля, и в разных структурах они разные (с разным назначением битов). Ну, к примеру, иерархия дескрипторов USB. В Configuration Descriptor у поля bMAttributes свои биты, в Endpoint Descriptor — свои, а поля одинаково называются. Немудрено и напутать.


Pzz>А если обозвать их разными типами, то (1) не перепутаешь (2) не надо даже как-то в комментариях особо выделять, какие биты к чему относятся, это выражено в самом коде.


Ну это понятно. Это старый добрый паттерн Strong Typedef, полезность которого не вызывает вопросов. Некоторый дискомфорт всё же возникает по поводу того, что этот паттерн гвоздями прибит к языку. Возможно, это просто с непривычки.
--
Справедливость выше закона. А человечность выше справедливости.
Re[8]: Внезапно, ||= и &&=
От: Pzz Россия https://github.com/alexpevzner
Дата: 09.08.25 11:23
Оценка:
Здравствуйте, rg45, Вы писали:

Pzz>>Можно явно привести.


R>Ну вот этого как раз и не хотелось бы. Это примерно то же самое, как при работе с типизированными указателями на каждый чих приходилось бы приводить их к void*.


Ну, через void* можно что угодно к чему угодно привести, без какого-либо контроля.

В данном случае компилятор всё же не даст сделать какую-то полную дичь. Например, сравнить число со строкой.

R>Ну это понятно. Это старый добрый паттерн Strong Typedef, полезность которого не вызывает вопросов. Некоторый дискомфорт всё же возникает по поводу того, что этот паттерн гвоздями прибит к языку. Возможно, это просто с непривычки.


Не раздражает. В рееальном коде редко встречается.
Re[9]: Внезапно, ||= и &&=
От: rg45 СССР  
Дата: 09.08.25 11:55
Оценка:
Здравствуйте, Pzz, Вы писали:

R>>Ну вот этого как раз и не хотелось бы. Это примерно то же самое, как при работе с типизированными указателями на каждый чих приходилось бы приводить их к void*.


Pzz>Ну, через void* можно что угодно к чему угодно привести, без какого-либо контроля.


Ну так вот именно. В т.ч. и сложить яблоки с апельсинами. Почему я и говорю, что не хотелось бы, чтоб это становилось обычным паттерном проектирования/кодирования. Когда подобные приведения размазаны толстым слоем по всему коду, не заметить бессмысленное действие — как два пальца об асфальт. Сам паттерн Strong Typedef обесценивается при этом.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 09.08.2025 11:57 rg45 . Предыдущая версия .
Re[4]: Внезапно, ||= и &&=
От: so5team https://stiffstream.com
Дата: 09.08.25 11:55
Оценка: 8 (1)
Здравствуйте, rg45, Вы писали:

R>
R>struct A {

R>   // . . . Members . . .

R>   bool operator == (const A&) const = default;
R>   auto operator <=> (const A&) const = default;
R>};
R>


А зачем здесь еще и `operator==` как default?
Вроде бы если мы декларируем `operator<=>` как default, то и операторы равенства/неравенства автоматически выводятся.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.