Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 17.03.2011
Сообщений: 50

Что может возвращать выражение в С++?

03.02.2017, 01:01. Показов 3669. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В стандарте написано, что "Выражение может возвращать значение в качестве результата и может вызывать побочные эффекты."

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

Может ли быть еще какой-то четвертый вариант? Например такой, что выражение не возвращает значение и не вызывает побочные эффекты.

Хочу разобраться в этом вопросе. Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.02.2017, 01:01
Ответы с готовыми решениями:

Что может входить в числовое выражение?
гуглил ответ на свой вопрос, везде в определении числового выражения написано, что числовое выражение может иметь только: числа, скобки и...

Почему CreateWindow может возвращать NULL?
Решил разобраться как устроено управление окнами на уровне API. Посмотрел стартовый пример из Visual Studio, разобрался в процессе...

Может ли конструктор формы возвращать NULL
Это нужно вот зачем. Создаю форму, которая должна работать с файлом. А файла нет. Существование форму бессмысленно. ...

49
807 / 534 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
05.02.2017, 01:56
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от IGPIGP Посмотреть сообщение
Теоретики утверждают что void это значение (содержащее ничто). То есть можно написать return void;
Быть может, этих теоретиков и можно отчасти понять...
C++
1
2
3
4
5
6
7
8
9
10
11
12
void f1()
{   }
 
void f2()
{
    return f1(); // !!!
}
 
int main()
{
    f2();
}
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.02.2017, 02:37
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
С делали два человека, ++ доделывал вообще один.
Думаете в старой литературе написано нечетко? Я вот решил, что данное определение связано с новыми редакциями стандарта. Если всё не так, то не о чём я затеял говорить. Почти.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Т.е. если парсимая часть выражения (а часть выражения это такое же выражение как и целое выражение) есть операнд то тогда результат должен быть и должен быть неявно приводим к ожидаемому типу(для С++ типам). Если же операндом не является то программисту важны побочные эффекты выражения а не возвращаемый результат, зачем тогда парсеру вообще заморачиваться возвращаемым типом и вообще его наличием,
Ну так ведь есть тип void... У меня мало опыта, но то что мне приходилось разбирать становилось деревом или выполнялось рекурсивно. В первом случае, разбор дерева (исполнение распарсенного кода)) приводило к построению списка методов... Метод вроде NOP (пустышка) был полезен. При рекурсивном разборе тоже приходилось передавать результат (признак следующей по преоритету операции с операндами) в метод, где отыскивается операция, вычисляется результат и возвращается в виде текущего операнда. Везде нужно было вернуть что-то. Но это мелочи по сравнению с компилятором cpp. Интересно бы посмотреть, на выражения, которые ничего не возвращают.
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
Быть может, этих теоретиков и можно отчасти понять...
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
05.02.2017, 03:29
Цитата Сообщение от IGPIGP Посмотреть сообщение
Думаете в старой литературе написано нечетко?
Просто изобретатели языка мыслили логически. А коммитет пытается эту логику в какие то штампы облечь. а логика она потому и логика что в штампы не укладывается. Особенно гениальная логика. В результате понять как оно работает запросто а сформулировать четким непротиворечивым штампом нереально. Потому как в данном случае вопрос не наличия или отсутствия всякого присутствия возвращаемого значения а ожидает его или нет парсер.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.02.2017, 03:54
Вот интересное интервью BS:
http://www.codenet.ru/progr/cpp/straustrup.php
Вы принимали участие в разработке стандарта языка C++ с самого начала. Сильно ли он изменился со временем? Кто занимается разработкой новых стандартов?
-Сложно сказать. Разработка формального стандарта — это очень непростое и, как правило, муторное дело. (...и.т.д. ...)
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
05.02.2017, 06:12
Цитата Сообщение от IGPIGP Посмотреть сообщение
это очень непростое и, как правило, муторное дело
Ну еще бы. Боевого прославленного программера, дважды плюсокреатера, посадить бамашки разбирать аки крысу тыловую... естественно муторным покажется.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
05.02.2017, 12:38
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Ну еще бы. Боевого прославленного программера, дважды плюсокреатера, посадить бамашки разбирать аки крысу тыловую... естественно муторным покажется.
Я позволю себе пофантазировать по поводу:
Цитата Сообщение от BS Посмотреть сообщение
как правило, муторное дело.
Как видно из статьи, стандартом занимаются организации, которые за это платят. Можно предположить, что это не от недостатка занятости. У производителей железа, операционных систем и "тяжелого" программного обеспечения есть интерес. Нужно ли им популяризовать язык и снижать его трудозатраты? Вряд ли. У них есть достаточно программистов, поступлений, готового продукта и пр. А вот увеличить интервал между собой и теми кто может наступить на пятки, это может быть стимулом к действию. Есть и другие соображения, но не стану их выкладывать.
Мэтр - частное лицо и вынужден лавировать. Хотя понимает, что чем сложнее правила игры, тем меньше шансов увидеть новый компилятор от новоприбывшей команды.
Это я мрачно шутю.
Нормальным людям снятся неприличные вещи, а мне вот что приснилось:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
int a=0;
 
struct Kill_me_now{
int &b;
Kill_me_now():b(a){a++; cout <<" ctor " << a << endl;}
~Kill_me_now(){cout<<a--<< " dtor " << endl;}
};
 
int main(int argc, char* argv[])
{
Kill_me_now k1,k2,k3;
//вот эти операторы содержат код не возвращающий значения, но к чему считать это выражением?
//например, k1.~Kill_me_now() - вызов, который ничего не возвращает
k1.~Kill_me_now();
k2.~Kill_me_now();
k3.~Kill_me_now();
cout<<endl;
system("pause");
return 0;
}
Одна надежда, - может оно не приличное тоже и я не ещё так плох?
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
06.02.2017, 03:46
Цитата Сообщение от IGPIGP Посмотреть сообщение
операционных систем и "тяжелого" программного обеспечения есть интерес.
При этом у реальных производителей ос уомпиляторов и "тяжелого" ПО на их основе развитие пошло совсем в противоположную сторону чем двигает коммитет. При этом почитав те направления которые видит Страуструп он тоже в этом плане во многом согласен с производителями а не коммитетом. Кстати та фигня которую тянет комитет в язык в основном библиотечная потому как библиотечные средства использовать обязаловки нет так же как всегда остается возможность реализовать свою альтернативу, в отличии от к примеру переноса полоумных указателей и контейнеров STL на нативный уровень.

Добавлено через 3 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Одна надежда, - может оно не приличное тоже и я не ещё так плох?
Суть тут немного другая - само понятие "возвращаемое значение" имеет смысл только там где парсер ожидает возврата. В остальных местах (в том числе и при ручном вызове деструктора) такое понятие просто бессмысленно и неважно, поскольку парсер его не ожидает и следовательно не обрабатывает.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13205 / 6840 / 1822
Регистрация: 18.10.2014
Сообщений: 17,298
07.02.2017, 01:07
Цитата Сообщение от IGPIGP Посмотреть сообщение
Теоретики утверждают что void это значение (содержащее ничто). То есть можно написать return void;
Как несложно догадаться, это было сделано для целей упрощения написания шаблонного кода, чтобы не надо было плодить "особые" ветки именно для ситуаций, когда в return вдруг оказывается void.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Оператор ; тоже не должен ничего возвращать.
Что такое "оператор ;"?

Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Суть тут немного другая - само понятие "возвращаемое значение" имеет смысл только там где парсер ожидает возврата. В остальных местах (в том числе и при ручном вызове деструктора) такое понятие просто бессмысленно и неважно, поскольку парсер его не ожидает и следовательно не обрабатывает.
Это не имеет никакого отношения к языкам С и С++ ибо в обоих языках с самого начала времен одним из самых фундаментальных типов statement был expression statement, согласно семантике которого результат выражения таки возвращается во вызывающий код, но всегда игнорируется. Поэтому не ясно при чем здесь "ожидания парсера".

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

Чем выделился ручной вызов псевдо-деструктора мне тоже не ясно - это обычное выражение типа void, ничем не отличающееся от других выражений типа void.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.02.2017, 01:31
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Чем выделился ручной вызов псевдо-деструктора мне тоже не ясно - это обычное выражение типа void
Я никогда об этом не думал. Просто запомнил, что этот метод нельзя определять с типом возвращаемого значения (даже void) и решил, что у него нет типа. Хотя представить это трудно. Тогда вопрос остаётся открытым. Хочу видеть выражение без возвращаемого значения.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
07.02.2017, 07:09
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Поэтому не ясно при чем здесь "ожидания парсера".
Потому что это причина всего остального. Те кто проектировал С начали с проектирования парсера. А уже при готовом компиляторе натягивали какую то пояснилку.

Добавлено через 1 минуту
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
которые не относятся к обработке возвращаемого значения
То ясное. дело. Стек все равно чистить может понадобится. Но это относится к обработке вызова функций.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.02.2017, 07:09
Помогаю со студенческими работами здесь

Может ли функция возвращать два значения?
Есть некоторая функция F. У неё входные параметры - t, x. Выходные: xp, xp, где xp:=t*x; xp:=t+x; В дальнейшем xp и xp будут...

Функция не может возвращать Userdefinedtype / список?
Не получилось, почему-то... подскажите

Может ли свойство возвращать значения разных типов?
Здравствуйте. Скажите пожалуйста существует ли возможность возвращать значение в зависимости от того какое необходимо например...

Может ли функция возвращать значения двух переменных?
Заполнить матрицу n размерности по схеме, https://www.cyberforum.ru/attachment.php?attachmentid=508685&amp;d=1427895759 ...

Может ли виртуальная функция возвращать значения разных типов?
Привет, форумчане! :) Столкнулся с небольшой проблемкой и интересуюсь ответом на вопрос! Может ли виртуальная функция возвращать...


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

Или воспользуйтесь поиском по форуму:
50
Ответ Создать тему
Новые блоги и статьи
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так? Да, всё верно. Я — искусственный интеллект. Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
Модель здравосохранения 14. Собираем всю модель вместе.
anaschu 22.05.2026
Модель собрана. В будущих постах на видео я покажу, как она работает. В этом посте запускаем её, проверяем результаты и разбираем что можно с ней делать дальше. Перед запуском проверяем. . .
Модель здравоохранения 13. Добавление самой системы здравоохранения.
anaschu 22.05.2026
В предыдущем посте мы настроили болезни. Теперь добавим события, которые управляют здоровьем всего коллектива, а также настроим рабочий график и расчёт финансов. В Main создаём четыре события. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru