Здравствуйте, ArtDenis, Вы писали: AD>Это просто чтение значение переменной. После это значение не используется и просто теряется. Прикол в том, эта вещь применяется. Например, если устройство замапировано на адрес памяти, а чтение по специальному адресу например сбрасывает флаги устройства. Как-то так:
AD>
Здравствуйте, rising_edge, Вы писали:
_>С volatile особая песня. Это фактически запрет компилятору соптимизировать, т.е. попросту удалить неиспользуемую переменную.
Обрати внимание, что у меня нету переменной вообще. Есть только адрес и чтение по указанному адресу. volatile не запрещает компилятору оптимизировать. Она лишь даёт две гарантии:
1. Обращение по адресу (чтение или запись) будет обязательно произведено (оптимизатор не вправе его выкидывать)
2. Не будет переупорядочивания последовательности обращений к volatile
Здравствуйте, m11, Вы писали:
m11>Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>По-прежнему дико переусложнено
АТ>>
АТ>>int main()
АТ>>{
АТ>> 1;
АТ>>}
АТ>>
m11>а почему тут нету C4716: '': must return a value ????
Потому что это функция `main`, у которой особые правила. В ней не обязательно делать `return`. Не сделаешь `return` — будет автоматически сделано `return 0`.
N>Имхо, после оптимизаций компилятор все повыкидывает.
N>условие (value == 0) никогда не выполнится, значит можно выкинуть. N>переменная value в итоге нигде не используется, можно выкинуть.
Выполнится или не выполнится тут условие никакого значения не имеет. Программа вообще не имеет наблюдаемого поведения, значит все сразу будет выкинуто.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>А причем здесь "оператор"?
АТ>>Упрощенно выражаясь, тело функции на языках С или С++ состоит из инструкций (statements). Statements бывают разных видов. Один из самых распространенных — expression statement, то есть выражение. `value;` — это вполне легальный expression statement.
Pzz>Оператор — это и есть statement. Так уж наши переводчики придумали, еще в советские времена.
Это пусть останется на их совести. Я видел попытки использовать слово "инструкция" в качестве перевода для "statement". Тоже не очень хороший вариант...
Pzz>И да, действительно, в си нет оператора присваивания, зато есть оператор — выражение.
А это откуда? С каких это пор в С нет оператора присваивания???
Здравствуйте, Андрей Тарасевич, Вы писали:
Pzz>>И да, действительно, в си нет оператора присваивания, зато есть оператор — выражение.
АТ>А это откуда? С каких это пор в С нет оператора присваивания???
С таких.
i = 5;
Это — выражение. У него даже значение есть. И ничем, синтаксически, не отличается от любого выражения;
foo (i = 5);
i + 5;
Вполне корректный код на Си. В первой строке i присваивается 5, и результат (т.е., 5) передается функции foo. Кстати, в C++ оператор = может быть перегружен, и результат может быть какой-нибудь другой, не 5. Но обычно так не делают, из человеколюбия.
Во второй строке вычисляется сумма i и 5, и с результатом ничего не делается. Синтаксически это корректно, хоть и бессмысленно.
И да, по-русски в контексте C++ два разных слова переводятся, как оператор: operator и statement.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, Андрей Тарасевич, Вы писали:
Pzz>>>И да, действительно, в си нет оператора присваивания, зато есть оператор — выражение.
АТ>>А это откуда? С каких это пор в С нет оператора присваивания???
Pzz>С таких.
Pzz>
Pzz>i = 5;
Pzz>
Pzz>Это — выражение. У него даже значение есть. И ничем, синтаксически, не отличается от любого выражения;
И что? Это действительно выражение. Оно использует оператор присваивания.
Но с чего бы это вдруг тот факт, что это является выражением, каким-то образом свидетельствует о том, что "в С нет оператора присваивания"?
Pzz>
Pzz>foo (i = 5);
Pzz>i + 5;
Pzz>
Pzz>Вполне корректный код на Си. В первой строке i присваивается 5, и результат (т.е., 5) передается функции foo.
Это прекрасно. Но к чему здесь эти банальности? Вопрос по-прежнему тот же: с чего это вдруг вы заявляете, что в С "нет оператора присваивания"? Какое отношение вышеприведенные примеры имеют к ответу на этот вопрос?
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Это прекрасно. Но к чему здесь эти банальности? Вопрос по-прежнему тот же: с чего это вдруг вы заявляете, что в С "нет оператора присваивания"? Какое отношение вышеприведенные примеры имеют к ответу на этот вопрос?
В C нет assignment statement. Есть expression statement.
Assignment operator в C есть.
Если это терминологический спор, я считаю, он исчерпан. Иначе не понимаю, о чем мы спорим.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>Это прекрасно. Но к чему здесь эти банальности? Вопрос по-прежнему тот же: с чего это вдруг вы заявляете, что в С "нет оператора присваивания"? Какое отношение вышеприведенные примеры имеют к ответу на этот вопрос?
Pzz>В C нет assignment statement. Есть expression statement.
Pzz>Assignment operator в C есть.
Pzz>Если это терминологический спор, я считаю, он исчерпан. Иначе не понимаю, о чем мы спорим.
Это я не понимаю. Потому и задаю вопросы, пытаясь это выяснить.
Вы, очевидно, пытаетесь настаивать на том, что термин "оператор" должен означать именно и только "statement", и на этом строите последующие [странные и сенсационные] заявления вроде "в С нет оператора присваивания". Зачем? Не ясно.
Ответ: нет. Термин "оператор" означает именно "operator". Если в каких то источниках еще пытаются применять этот термин для обозначения "statement", то либо сами разбирайтесь по контексту, где это "operator", а где это "statement", либо сразу отправляйте такие источники в мусорное ведро. В любом случае, использовать эту терминологическую кашу для оправдания феерически сенсационных заявлений, вроде "в С нет оператора присваивания", не приемлемо.
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Ответ: нет. Термин "оператор" означает именно "operator". Если в каких то источниках еще пытаются применять этот термин для обозначения "statement", то либо сами разбирайтесь по контексту, где это "operator", а где это "statement", либо сразу отправляйте такие источники в мусорное ведро. В любом случае, использовать эту терминологическую кашу для оправдания феерически сенсационных заявлений, вроде "в С нет оператора присваивания", не приемлемо.
Интересно, а каким же словом в православных источниках принято называть "statement", раз уж теперь слово "оператор" изменило значение?
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>>Ответ: нет. Термин "оператор" означает именно "operator". Если в каких то источниках еще пытаются применять этот термин для обозначения "statement", то либо сами разбирайтесь по контексту, где это "operator", а где это "statement", либо сразу отправляйте такие источники в мусорное ведро. В любом случае, использовать эту терминологическую кашу для оправдания феерически сенсационных заявлений, вроде "в С нет оператора присваивания", не приемлемо.
Pzz>Интересно, а каким же словом в православных источниках принято называть "statement", раз уж теперь слово "оператор" изменило значение?
Во-первых, в тех "православных источниках", которые используют слово "оператор" для обозначения "statement", это же слово "оператор" одновременно используется и в значении "operator". Как я сказал выше, что именно имеется в виду в каждом конкретном случае приходится выяснить из контекста. При этом не существует и никогда не существовало никаких "православных источников", в которых бы слово "оператор" было бы эксклюзивно привязано к значению "statement". Поэтому меня и удивили такие загадочные и феерически бессмысленные ваши заявления как "в языке С нет оператора присваивания". И я тут же вступил в разговор, чтобы отменить эти ваши заявления. Что и сделал.
Во-вторых, я кажется ясно дал понять выше, что практика перевода термина "statement" как "оператор" является неприемлемой, а также напомнил о существовании такого варианта перевода, как "инструкция". (Это тоже не самый идеальный вариант перевода для "statement", но намного лучше, чем неоднозначное "оператор"). После того, как я сделал это утверждение (а я делал его и раньше) никаких источников, переводящих "statement" как "оператор", нет и быть не может. А кто там что накорябал в некоей потешной макулатуре, большого значения никогда не имело.
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Во-вторых, я кажется ясно дал понять выше, что практика перевода термина "statement" как "оператор" является неприемлемой, а также напомнил о существовании такого варианта перевода, как "инструкция". (Это тоже не самый идеальный вариант перевода для "statement", но намного лучше, чем неоднозначное "оператор"). После того, как я сделал это утверждение (а я делал его и раньше) никаких источников, переводящих "statement" как "оператор", нет и быть не может. А кто там что накорябал в некоей потешной макулатуре, большого значения никогда не имело.
m11>>value; это разве оператор? Еще с древних паскальских времен тут вроде должна быть ошибка типа "необходим оператор" а с++ оно вон какое.
AD>Это просто чтение значение переменной. После это значение не используется и просто теряется.
Нет там никакого чтения. [expr.context]/2: > The lvalue-to-rvalue conversion is applied if and only if the expression is a glvalue of volatile-qualified type and …
Здравствуйте, Андрей Тарасевич, Вы писали:
АТ>Программа вообще не имеет наблюдаемого поведения, значит все сразу будет выкинуто.
Наблюдаемое поведение: результат 0.
Здравствуйте, ArtDenis, Вы писали:
AD>2. Не будет переупорядочивания последовательности обращений к volatile
Вот тут есть сомнения, volatile — это не барьер, может компилятор и не будет этого делать, но и инструкцию с барьером он тоже не обязан добавлять, так что процессор вполне может и сам это сделать.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, ути-пути, Вы писали:
AD>>2. Не будет переупорядочивания последовательности обращений к volatile
УП>Вот тут есть сомнения, volatile — это не барьер, может компилятор и не будет этого делать, но и инструкцию с барьером он тоже не обязан добавлять, так что процессор вполне может и сам это сделать.
Это лишь означает, что если в потоке исполнения сначала стоит чтение volatile, а затем запись volatile, то оптимизатор не может выдать код, который сначала записывает, а потом читает, иначе, например, сломается работа с устройствами через шину памяти. При этом без volatile чтение и запись может переупорядочиваться как угодно для удобства оптимизации, а так же не выполняться вообще.