-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
1

Еще раз о бинарных и унарных операциях

08.05.2019, 15:38. Показов 2338. Ответов 26
Метки нет (Все метки)

Ну да все мы знаем, что в C++ есть бинарные, унарные и даже тернарные операции.
Но вот почему то все учебники стыдливо обходят стороной такой вопрос, а вот скобки такие () и такие [] - это какая операция - унарная или бинарная? В списки приоритетов и ассоциативности они присутствуют, а вот насчет их унарности или бинарности - одна тишина.

Может знающие люди прояснят ситуацию.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2019, 15:38
Ответы с готовыми решениями:

Калькулятор бинарных и унарных операций
Здравствуйте. У меня есть код калькулятора, в котором я не могу правильно использовать циклы. Нужно...

Перегрузка операторов (бинарных и унарных)
Как сделать на основе этого кода не менее 2 унарных и 2 бинарных операторы. #include <iostream>...

Перегрузка унарных и бинарных операторов
У меня есть задача, только я немного не понимаю сути, что конкретно нужно сделать... В основном это...

Перегрузка унарных и бинарных операторов в шаблоне
Доброго времени суток! Недавно столкнулся с проблемой при написании такого шаблона: template...

26
77 / 69 / 37
Регистрация: 26.07.2015
Сообщений: 153
08.05.2019, 15:47 2
() и [] унарные, но всегда определяется как члены класса
0
"C with Classes"
1581 / 1360 / 511
Регистрация: 16.08.2014
Сообщений: 5,647
Записей в блоге: 1
08.05.2019, 15:48 3
я не знающий, но думаю это унарные пост префиксные.
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
08.05.2019, 16:07 4
Цитата Сообщение от Si14 Посмотреть сообщение
() и [] унарные, но всегда определяется как члены класса
Унарный оператор это тот который работает с одним операндом.
Оператор () же может иметь multiple subscription.
Да и вообще они ни унарные, ни бинарные.

Унарные операторы, это только эти:
Код
*  &  +  -  !  ~
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
08.05.2019, 16:45  [ТС] 5
Ну хорошо, вот вы все высказались, что мол они унарные, тогда опять встает вопрос, где операция, а где операнд, ведь любая операция она должна стоять вроде бы либо слева, либо справа от своего операнда. Ну а что вы можете пояснить по этому случаю?
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
08.05.2019, 17:04 6
Цитата Сообщение от Просто Саша Посмотреть сообщение
Ну а что вы можете пояснить по этому случаю?
Ничего, потому что они не унарные, я же вам сказал.
Вот так выглядит унарный оператор
C++
1
2
3
(a).operator+();
// т.е. это тоже самое что и выражение
+a;
операторы же () и [] выглядят так
C++
1
2
3
4
5
(a).operator[](index);
(a).operator()(...);
// т.е. это тоже самое что и выражения
a[index];
a(1, 2, 3);
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
08.05.2019, 19:06  [ТС] 7
Короче я так понял, что ответа не дождусь.
Ну это вы по правилам перегрузки судите, тем не менее и там есть имключения, например с перегрузкой ->, но главное так и не понятно бинарные они или унарные.

Между прочим, чего вас пытать то? Почему в учебниках об этом ничего не пишется?
0
"C with Classes"
1581 / 1360 / 511
Регистрация: 16.08.2014
Сообщений: 5,647
Записей в блоге: 1
08.05.2019, 20:24 8
---
0
5233 / 2887 / 1208
Регистрация: 07.02.2019
Сообщений: 7,284
08.05.2019, 20:46 9
Просто Саша, унарные оперируют данными только одного объекта, дальше по этой логике...
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,745
08.05.2019, 21:12 10
Цитата Сообщение от Просто Саша Посмотреть сообщение
а вот скобки такие () и такие [] - это какая операция - унарная или бинарная?
Операция [] - бинарная. Первый операнд у нее - указатель на массив, второй - индекс.
Операция () формально тоже бинарная. Первый операнд у нее - указатель на функцию, второй - список аргументов.
Но тут, как говорится - хоть горшком назови, только в печь не ставь!
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
08.05.2019, 21:25  [ТС] 11
Ну вот теперь пошли другие мнения, что мол они не унарные, а бинарные.
Короче, господа, где это выяснить то можно, может к самому Страурстпу обратиться?
Тока не факт, что он сам знает и сможет дать правильный ответ.
0
"C with Classes"
1581 / 1360 / 511
Регистрация: 16.08.2014
Сообщений: 5,647
Записей в блоге: 1
08.05.2019, 21:36 12
Цитата Сообщение от Просто Саша Посмотреть сообщение
может к самому Страурстпу обратиться?
можешь к стандарту обратиться
http://eel.is/c++draft/#expr
http://eel.is/c++draft/#over
как я понял нет четкого разделения на унарные и бинарные операторы, в каком смысле ты их понимаешь
0
-1 / 25 / 4
Регистрация: 27.11.2017
Сообщений: 375
08.05.2019, 22:07  [ТС] 13
Цитата Сообщение от _stanislav Посмотреть сообщение
можешь к стандарту обратиться
JОбратимся, еще не дочитал, но ваши ссылки никуда не ведут.
Влпрос в другм, может скобки вообще вывести из аблицы приоритетов и ассоциативности.
Ну нечего им там делать.
0
"C with Classes"
1581 / 1360 / 511
Регистрация: 16.08.2014
Сообщений: 5,647
Записей в блоге: 1
08.05.2019, 22:24 14
Цитата Сообщение от Просто Саша Посмотреть сообщение
В списки приоритетов и ассоциативности они присутствуют, а вот насчет их унарности или бинарности - одна тишина.
твоя логика такова, если они есть в таблице приоритетов и ассоциативности значит обязательно должны относится либо к унарному или бинарному типу? мне кажется это не правильное мышление.
0
16085 / 8686 / 2121
Регистрация: 30.01.2014
Сообщений: 14,972
08.05.2019, 22:46 15
Цитата Сообщение от Просто Саша Посмотреть сообщение
Ну да все мы знаем, что в C++ есть бинарные, унарные и даже тернарные операции.
Но вот почему то все учебники стыдливо обходят стороной такой вопрос, а вот скобки такие () и такие [] - это какая операция - унарная или бинарная? В списки приоритетов и ассоциативности они присутствуют, а вот насчет их унарности или бинарности - одна тишина.
Они не унарные и не бинарные.
Вообще эта классификация нужна лишь с одной целью: отличать операторы, которые могут использоваться в бинарном и унарном контекстах. Т.е. называя оператор + бинарным, стандарт обозначает, что данный оператор применяется для двух операндов, чтобы при описании отличать его от унарной формы оператора +. Т.е. это просто обозначение особенностей грамматики в тех или иных случаях, а не какая-то основополагающая классификация.

А unary-operator из стандарта - это не классификация операторов, а обозначение части грамматики. И именно поэтому нет binary-operator, так как, собственно, его "binary" образуется соответствующим выражением (например, для * или /). Для [] и других - выражение формируется так.

Вывод из этого только один. Бессмысленно составлять какие-либо таблицы, отличные от тех, что приведены в стандарте. В учебниках начального уровня такие таблицы приводят для простоты усваивания информации, но, при переходе на ступеньку выше в своих знаниях, от них нужно отказаться, в пользу прямого применения грамматики С++.

Цитата Сообщение от Просто Саша Посмотреть сообщение
Короче, господа, где это выяснить то можно, может к самому Страурстпу обратиться?
Давайте обратимся:
Цитата Сообщение от The C++ Programming Language (3rd edition)
11.2.1 Binary and Unary Operators [over.binary]

A binary operator can be defined by either a nonstatic member function taking one argument or a
nonmember function taking two arguments. For any binary operator @, aa@bb can be interpreted as
either aa.operator@(bb) or operator@(aa,bb)
. If both are defined, overload resolution (§7.4)
determines which, if any, interpretation is used.

....

A unary operator, whether prefix or postfix, can be defined by either a nonstatic member function
taking no arguments or a nonmember function taking one argument. For any prefix unary operator
@, @aa can be interpreted as either aa.operator@() or operator@(aa)
. If both are defined, overload
resolution (§7.4) determines which, if any, interpretation is used. For any postfix unary operator @, aa@ can be
interpreted as either aa.operator@(int) or operator@(aa,int).
This is explained further in §11.11.
If both are defined, overload resolution (§7.4) determines which, if any, interpretation is used.
An operator can be declared only for the syntax defined for it in the grammar (§A.5). For example, a
user cannot define a unary % or a ternary +.
Ключевое выделил крупно. Это именно то, что вам нужно сделать, открыть книгу, параграф A.5.
1
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
08.05.2019, 22:56 16
DrOffset, тем не менее, арность - вполне себе четкая характеристика. Будь то операция, оператор, да и даже выражение (часть выражения).
0
16085 / 8686 / 2121
Регистрация: 30.01.2014
Сообщений: 14,972
08.05.2019, 23:10 17
Цитата Сообщение от avgoor Посмотреть сообщение
тем не менее, арность - вполне себе четкая характеристика.
Четкая, но в С++ она определяется из грамматики, а не наоборот, как представляется ТС. B для тех случаев, где это не важно - например для ->, эта характеристика просто не вводится. Собственно это все, что я хотел сказать постом выше.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
09.05.2019, 00:52 18
Цитата Сообщение от DrOffset Посмотреть сообщение
она определяется из грамматики, а не наоборот, как представляется ТС
Вот именно. Мое замечание было о том, что арность чего-то - это базовое понятие, которое должно быть понятно (хм... простите за тавтологию) тому, кто читает стандарт. А то, тут уже начали говорить, что есть какие-то "бинарный" и "унарный" типы.
0
16085 / 8686 / 2121
Регистрация: 30.01.2014
Сообщений: 14,972
09.05.2019, 01:59 19
Цитата Сообщение от avgoor Посмотреть сообщение
А то, тут уже начали говорить, что есть какие-то "бинарный" и "унарный" типы.
Я ничего такого не говорил.

Цитата Сообщение от avgoor Посмотреть сообщение
Мое замечание было о том, что арность чего-то - это базовое понятие, которое должно быть понятно (хм... простите за тавтологию) тому, кто читает стандарт.
Может я не совсем понятно выразился, или вам просто охота со мной поговорить
Арность - да, это базовое понятие вообще, но в стандарте оно определяется грамматикой. Т.е. в стандарте - оно не базовое, а производное из грамматики - смотрите, Страуструп тоже об этом пишет. ТС же хочет поделить все операторы на бинарные, унарные, н-арные, именно так, как будто бы это самое базовое, что есть. Я же говорю, что арность - это свойство некоторых операторов, для которых грамматика описывает ее, для остальных это понятие не применяется. Именно поэтому в стандарте нет никаких таблиц арности или чего-то такого.

ТС говорил об исключениях для некоторых операторов. Но исключения бывают только из общих правил. Здесь же все наоборот, общее правило - это грамматика, а арность - частный случай. В этом ключе никаких исключений нет. Есть несколько частных случаев, с арностью и без.
0
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
09.05.2019, 02:09 20
Цитата Сообщение от DrOffset Посмотреть сообщение
или вам просто охота со мной поговорить
Всегда приятно поговорить с умным человеком.
Цитата Сообщение от DrOffset Посмотреть сообщение
Я ничего такого не говорил.
Я не про вас. Я про:
Цитата Сообщение от _stanislav Посмотреть сообщение
обязательно должны относится либо к унарному или бинарному типу
Цитата Сообщение от DrOffset Посмотреть сообщение
но в стандарте оно определяется грамматикой.
Блин. Оно не в стандарте определяеццо. В стандарте есть на него ссылка. В расчете на то, что тот, кто читает про операции (операторы, выражения etc.) уже знает, что такое арность операции.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2019, 02:09
Помогаю со студенческими работами здесь

В чём отличие унарных и бинарных операторов?
Подскажите пожалуйста, это унарный или бинарный оператор (а-b для комплексных чисел). Я знаю, что...

Ввести строку символов. Если символ в данной строке встречается один раз, в конце строки добавлять ещё раз его
Ввести строку символов. Если символ в данной строке встречается один раз, в конце строки добавлять...

Если символ в данной строке встречается один раз, в конце строки добавлять ещё раз этот символ
Помогите с задачей на C# Ввести строку символов. Если символ в данной строке встречается один раз,...

Почему так(комбинации бинарных и не бинарных вводов и выводов)?
#include <string> #include <iostream> #include <fstream> #include <iomanip> using namespace...

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

еще раз об Id
Ситуация в следующем, единственный существоваший id пользователя погиб вместе с жестким диском....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru