Re[6]: Забавно
От: ArtDenis Россия  
Дата: 08.05.22 04:02
Оценка:
Здравствуйте, m11, Вы писали:

m11>Это до чего довели язык из других функций нельзя а из main можна ;|


Долго же ты спал )) Это стало стандартом в си с 99-года
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[5]: Забавно
От: ути-пути Россия  
Дата: 08.05.22 04:15
Оценка:
Здравствуйте, m11, Вы писали:

m11>по идее с uint32_t tmp = должно всегда читать и без volatile


Не должно, поскольку это можно соптимизировать без видимого изменения поведения.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[4]: Забавно
От: rising_edge  
Дата: 08.05.22 04:59
Оценка:
Здравствуйте, ArtDenis, Вы писали:
AD>Это просто чтение значение переменной. После это значение не используется и просто теряется. Прикол в том, эта вещь применяется. Например, если устройство замапировано на адрес памяти, а чтение по специальному адресу например сбрасывает флаги устройства. Как-то так:

AD>
AD>#define RESET_FLAGS_ADDR 0xBAADF00D

AD>void reset_flags() 
AD>{
AD>    *(*volatile uint32_t)(RESET_FLAGS_ADDR);
AD>}
AD>


AD>Правда, бывает что иногда пишут что-то типа

AD>
AD>uint32_t tmp = *(*volatile uint32_t)(RESET_FLAGS_ADDR);
AD>

AD>Видимо думают, что без uint32_t tmp = значение не прочитается ))

С volatile особая песня. Это фактически запрет компилятору соптимизировать, т.е. попросту удалить неиспользуемую переменную.

Ещё один широко используемый приём:
void reset_flags(int x)
{
    (void) x;
}

Применяется для подавления сообщения компилятора о неиспользуемом аргументе функции.
Re[5]: Забавно
От: ArtDenis Россия  
Дата: 08.05.22 06:27
Оценка: :)
Здравствуйте, rising_edge, Вы писали:

_>С volatile особая песня. Это фактически запрет компилятору соптимизировать, т.е. попросту удалить неиспользуемую переменную.


Обрати внимание, что у меня нету переменной вообще. Есть только адрес и чтение по указанному адресу. volatile не запрещает компилятору оптимизировать. Она лишь даёт две гарантии:
1. Обращение по адресу (чтение или запись) будет обязательно произведено (оптимизатор не вправе его выкидывать)
2. Не будет переупорядочивания последовательности обращений к volatile

Возможно что-то ещё, но лень гуглить
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Забавно
От: -n1l-  
Дата: 08.05.22 14:51
Оценка:
Здравствуйте, m11, Вы писали:

m11>
m11>int main()
m11>{ 
m11>int value=1;
m11>if (value==0) value;
m11>return 0;
m11>}
m11>



Имхо, после оптимизаций компилятор все повыкидывает.

условие (value == 0) никогда не выполнится, значит можно выкинуть.
переменная value в итоге нигде не используется, можно выкинуть.
Re[4]: Забавно
От: Андрей Тарасевич Беларусь  
Дата: 08.05.22 16:09
Оценка: +1
Здравствуйте, m11, Вы писали:

m11>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>По-прежнему дико переусложнено


АТ>>
АТ>>int main()
АТ>>{
АТ>>  1;
АТ>>}
АТ>>


m11>а почему тут нету C4716: '': must return a value ????


Потому что это функция `main`, у которой особые правила. В ней не обязательно делать `return`. Не сделаешь `return` — будет автоматически сделано `return 0`.
Best regards,
Андрей Тарасевич
Re[2]: Забавно
От: Андрей Тарасевич Беларусь  
Дата: 08.05.22 16:11
Оценка:
Здравствуйте, -n1l-, Вы писали:

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


m11>>
m11>>int main()
m11>>{ 
m11>>int value=1;
m11>>if (value==0) value;
m11>>return 0;
m11>>}
m11>>



N>Имхо, после оптимизаций компилятор все повыкидывает.


N>условие (value == 0) никогда не выполнится, значит можно выкинуть.

N>переменная value в итоге нигде не используется, можно выкинуть.

Выполнится или не выполнится тут условие никакого значения не имеет. Программа вообще не имеет наблюдаемого поведения, значит все сразу будет выкинуто.
Best regards,
Андрей Тарасевич
Re[5]: Забавно
От: Андрей Тарасевич Беларусь  
Дата: 08.05.22 16:14
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>А причем здесь "оператор"?


АТ>>Упрощенно выражаясь, тело функции на языках С или С++ состоит из инструкций (statements). Statements бывают разных видов. Один из самых распространенных — expression statement, то есть выражение. `value;` — это вполне легальный expression statement.


Pzz>Оператор — это и есть statement. Так уж наши переводчики придумали, еще в советские времена.


Это пусть останется на их совести. Я видел попытки использовать слово "инструкция" в качестве перевода для "statement". Тоже не очень хороший вариант...

Pzz>И да, действительно, в си нет оператора присваивания, зато есть оператор — выражение.


А это откуда? С каких это пор в С нет оператора присваивания???
Best regards,
Андрей Тарасевич
Re[6]: Забавно
От: Pzz Россия https://github.com/alexpevzner
Дата: 08.05.22 16:47
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

Pzz>>И да, действительно, в си нет оператора присваивания, зато есть оператор — выражение.


АТ>А это откуда? С каких это пор в С нет оператора присваивания???


С таких.

i = 5;


Это — выражение. У него даже значение есть. И ничем, синтаксически, не отличается от любого выражения;

foo (i = 5);
i + 5;


Вполне корректный код на Си. В первой строке i присваивается 5, и результат (т.е., 5) передается функции foo. Кстати, в C++ оператор = может быть перегружен, и результат может быть какой-нибудь другой, не 5. Но обычно так не делают, из человеколюбия.

Во второй строке вычисляется сумма i и 5, и с результатом ничего не делается. Синтаксически это корректно, хоть и бессмысленно.

И да, по-русски в контексте C++ два разных слова переводятся, как оператор: operator и statement.
Re[7]: Забавно
От: Андрей Тарасевич Беларусь  
Дата: 08.05.22 23:19
Оценка: +1
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Андрей Тарасевич, Вы писали:


Pzz>>>И да, действительно, в си нет оператора присваивания, зато есть оператор — выражение.


АТ>>А это откуда? С каких это пор в С нет оператора присваивания???


Pzz>С таких.


Pzz>
Pzz>i = 5;
Pzz>


Pzz>Это — выражение. У него даже значение есть. И ничем, синтаксически, не отличается от любого выражения;


И что? Это действительно выражение. Оно использует оператор присваивания.

Но с чего бы это вдруг тот факт, что это является выражением, каким-то образом свидетельствует о том, что "в С нет оператора присваивания"?

Pzz>
Pzz>foo (i = 5);
Pzz>i + 5;
Pzz>


Pzz>Вполне корректный код на Си. В первой строке i присваивается 5, и результат (т.е., 5) передается функции foo.


Это прекрасно. Но к чему здесь эти банальности? Вопрос по-прежнему тот же: с чего это вдруг вы заявляете, что в С "нет оператора присваивания"? Какое отношение вышеприведенные примеры имеют к ответу на этот вопрос?
Best regards,
Андрей Тарасевич
Re[8]: Забавно
От: Pzz Россия https://github.com/alexpevzner
Дата: 08.05.22 23:24
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Это прекрасно. Но к чему здесь эти банальности? Вопрос по-прежнему тот же: с чего это вдруг вы заявляете, что в С "нет оператора присваивания"? Какое отношение вышеприведенные примеры имеют к ответу на этот вопрос?


В C нет assignment statement. Есть expression statement.

Assignment operator в C есть.

Если это терминологический спор, я считаю, он исчерпан. Иначе не понимаю, о чем мы спорим.
Re[9]: Забавно
От: Андрей Тарасевич Беларусь  
Дата: 09.05.22 17:00
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>Это прекрасно. Но к чему здесь эти банальности? Вопрос по-прежнему тот же: с чего это вдруг вы заявляете, что в С "нет оператора присваивания"? Какое отношение вышеприведенные примеры имеют к ответу на этот вопрос?


Pzz>В C нет assignment statement. Есть expression statement.


Pzz>Assignment operator в C есть.


Pzz>Если это терминологический спор, я считаю, он исчерпан. Иначе не понимаю, о чем мы спорим.


Это я не понимаю. Потому и задаю вопросы, пытаясь это выяснить.

Вы, очевидно, пытаетесь настаивать на том, что термин "оператор" должен означать именно и только "statement", и на этом строите последующие [странные и сенсационные] заявления вроде "в С нет оператора присваивания". Зачем? Не ясно.

Ответ: нет. Термин "оператор" означает именно "operator". Если в каких то источниках еще пытаются применять этот термин для обозначения "statement", то либо сами разбирайтесь по контексту, где это "operator", а где это "statement", либо сразу отправляйте такие источники в мусорное ведро. В любом случае, использовать эту терминологическую кашу для оправдания феерически сенсационных заявлений, вроде "в С нет оператора присваивания", не приемлемо.
Best regards,
Андрей Тарасевич
Re[10]: Забавно
От: Pzz Россия https://github.com/alexpevzner
Дата: 09.05.22 17:21
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Ответ: нет. Термин "оператор" означает именно "operator". Если в каких то источниках еще пытаются применять этот термин для обозначения "statement", то либо сами разбирайтесь по контексту, где это "operator", а где это "statement", либо сразу отправляйте такие источники в мусорное ведро. В любом случае, использовать эту терминологическую кашу для оправдания феерически сенсационных заявлений, вроде "в С нет оператора присваивания", не приемлемо.


Интересно, а каким же словом в православных источниках принято называть "statement", раз уж теперь слово "оператор" изменило значение?
Re[11]: Забавно
От: Андрей Тарасевич Беларусь  
Дата: 09.05.22 21:27
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, Андрей Тарасевич, Вы писали:


АТ>>Ответ: нет. Термин "оператор" означает именно "operator". Если в каких то источниках еще пытаются применять этот термин для обозначения "statement", то либо сами разбирайтесь по контексту, где это "operator", а где это "statement", либо сразу отправляйте такие источники в мусорное ведро. В любом случае, использовать эту терминологическую кашу для оправдания феерически сенсационных заявлений, вроде "в С нет оператора присваивания", не приемлемо.


Pzz>Интересно, а каким же словом в православных источниках принято называть "statement", раз уж теперь слово "оператор" изменило значение?


Во-первых, в тех "православных источниках", которые используют слово "оператор" для обозначения "statement", это же слово "оператор" одновременно используется и в значении "operator". Как я сказал выше, что именно имеется в виду в каждом конкретном случае приходится выяснить из контекста. При этом не существует и никогда не существовало никаких "православных источников", в которых бы слово "оператор" было бы эксклюзивно привязано к значению "statement". Поэтому меня и удивили такие загадочные и феерически бессмысленные ваши заявления как "в языке С нет оператора присваивания". И я тут же вступил в разговор, чтобы отменить эти ваши заявления. Что и сделал.

Во-вторых, я кажется ясно дал понять выше, что практика перевода термина "statement" как "оператор" является неприемлемой, а также напомнил о существовании такого варианта перевода, как "инструкция". (Это тоже не самый идеальный вариант перевода для "statement", но намного лучше, чем неоднозначное "оператор"). После того, как я сделал это утверждение (а я делал его и раньше) никаких источников, переводящих "statement" как "оператор", нет и быть не может. А кто там что накорябал в некоей потешной макулатуре, большого значения никогда не имело.
Best regards,
Андрей Тарасевич
Re[12]: Забавно
От: Pzz Россия https://github.com/alexpevzner
Дата: 09.05.22 21:39
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Во-вторых, я кажется ясно дал понять выше, что практика перевода термина "statement" как "оператор" является неприемлемой, а также напомнил о существовании такого варианта перевода, как "инструкция". (Это тоже не самый идеальный вариант перевода для "statement", но намного лучше, чем неоднозначное "оператор"). После того, как я сделал это утверждение (а я делал его и раньше) никаких источников, переводящих "statement" как "оператор", нет и быть не может. А кто там что накорябал в некоей потешной макулатуре, большого значения никогда не имело.


Александр Григорьевич, перелогиньтесь.
Re[4]: Забавно
От: σ  
Дата: 09.05.22 23:28
Оценка:
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 …
Re[3]: Забавно
От: B0FEE664  
Дата: 11.05.22 15:28
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

АТ>Программа вообще не имеет наблюдаемого поведения, значит все сразу будет выкинуто.

Наблюдаемое поведение: результат 0.
И каждый день — без права на ошибку...
Re[6]: Забавно
От: ути-пути Россия  
Дата: 13.05.22 04:43
Оценка:
Здравствуйте, ArtDenis, Вы писали:

AD>2. Не будет переупорядочивания последовательности обращений к volatile


Вот тут есть сомнения, volatile — это не барьер, может компилятор и не будет этого делать, но и инструкцию с барьером он тоже не обязан добавлять, так что процессор вполне может и сам это сделать.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[7]: Забавно
От: ArtDenis Россия  
Дата: 13.05.22 08:08
Оценка:
Здравствуйте, ути-пути, Вы писали:

AD>>2. Не будет переупорядочивания последовательности обращений к volatile


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


Это лишь означает, что если в потоке исполнения сначала стоит чтение volatile, а затем запись volatile, то оптимизатор не может выдать код, который сначала записывает, а потом читает, иначе, например, сломается работа с устройствами через шину памяти. При этом без volatile чтение и запись может переупорядочиваться как угодно для удобства оптимизации, а так же не выполняться вообще.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[5]: Забавно
От: Michael7 Россия  
Дата: 14.05.22 07:06
Оценка: 12 (1)
Здравствуйте, Muxa, Вы писали:

m11>>Всегда можна усложнить


M>Или упростить:

M>
M>int main;
M>


И еще упростить

main;
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.