Забавно
От: m11  
Дата: 07.05.22 12:36
Оценка: -1
Почему это компилится?
без ошибок.
Clang правдо варнинг дает. а gcc и msvc вообше норм.

int main()
{ 
int value=1;
if (value==0) value;
return 0;
}
Отредактировано 07.05.2022 12:38 m11 . Предыдущая версия .
Re: Забавно
От: ArtDenis Россия  
Дата: 07.05.22 12:43
Оценка: 2 (1) +3
Здравствуйте, m11, Вы писали:

m11>Почему это компилится?

m11>без ошибок.

А в каком месте должна быть ошибка?
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[2]: Забавно
От: m11  
Дата: 07.05.22 13:52
Оценка:
m11>>Почему это компилится?
m11>>без ошибок.

AD>А в каком месте должна быть ошибка?


value; это разве оператор? Еще с древних паскальских времен тут вроде должна быть ошибка типа "необходим оператор" а с++ оно вон какое.
Re[3]: Забавно
От: ArtDenis Россия  
Дата: 07.05.22 14:03
Оценка:
Здравствуйте, m11, Вы писали:

m11>value; это разве оператор? Еще с древних паскальских времен тут вроде должна быть ошибка типа "необходим оператор" а с++ оно вон какое.


Это просто чтение значение переменной. После это значение не используется и просто теряется. Прикол в том, эта вещь применяется. Например, если устройство замапировано на адрес памяти, а чтение по специальному адресу например сбрасывает флаги устройства. Как-то так:

#define RESET_FLAGS_ADDR 0xBAADF00D

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


Правда, бывает что иногда пишут что-то типа
uint32_t tmp = *(*volatile uint32_t)(RESET_FLAGS_ADDR);

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

PS: причём тут паскаль, если форум про си и плюсы?
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: Забавно
От: Pavel Dvorkin Россия  
Дата: 07.05.22 14:07
Оценка: :)
Здравствуйте, m11, Вы писали:

Ну зачем же так сложно ?


int main()
{
    1;
    return 0;
}
With best regards
Pavel Dvorkin
Re[3]: Забавно
От: Андрей Тарасевич Беларусь  
Дата: 07.05.22 15:08
Оценка: +1
Здравствуйте, m11, Вы писали:


m11>>>Почему это компилится?

m11>>>без ошибок.

AD>>А в каком месте должна быть ошибка?


m11>value; это разве оператор? Еще с древних паскальских времен тут вроде должна быть ошибка типа "необходим оператор" а с++ оно вон какое.


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

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

Другое дело, что выражения мы обычно используем ради их результатов и/или побочных эффектов. Если у выражения и результат игнорируется, и побочных эффектов нет, то такое выражение бесполезно. Компилятор может выдать на эту тему предупреждение, если захочет. Но ошибки в этом нет.
Best regards,
Андрей Тарасевич
Отредактировано 07.05.2022 15:13 Андрей Тарасевич . Предыдущая версия . Еще …
Отредактировано 07.05.2022 15:10 Андрей Тарасевич . Предыдущая версия .
Re[2]: Забавно
От: Андрей Тарасевич Беларусь  
Дата: 07.05.22 15:09
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

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


PD>Ну зачем же так сложно ?


PD>

PD>int main()
PD>{
PD>    1;
PD>    return 0;
PD>}
PD>


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

int main()
{
  1;
}
Best regards,
Андрей Тарасевич
Re[2]: Забавно
От: prog123 Европа  
Дата: 07.05.22 15:10
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

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


PD>Ну зачем же так сложно ?


PD>

PD>int main()
PD>{
PD>    1;
PD>    return 0;
PD>}
PD>


зачем усложнять?
int main()
{
    1;
}
Re[3]: Забавно
От: m11  
Дата: 07.05.22 17:15
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

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


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


а почему тут нету C4716: '': must return a value ????
Re[3]: Забавно
От: m11  
Дата: 07.05.22 17:18
Оценка: :)
Здравствуйте, prog123, Вы писали:

P>зачем усложнять?

P>
int main()
P>{
P>    1;
P>}


Всегда можна усложнить
int main()
<% 1; %>
Re[4]: Забавно
От: Muxa  
Дата: 07.05.22 17:23
Оценка:
m11>Всегда можна усложнить

Или упростить:
int main;
Re[4]: Забавно
От: m11  
Дата: 07.05.22 17:26
Оценка: -1
Здравствуйте, ArtDenis, Вы писали:

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

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

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

Оно только с volatile будет читать.
по идее с uint32_t tmp = должно всегда читать и без volatile

AD>PS: причём тут паскаль, если форум про си и плюсы?

Ну вроде как родственые языки. чесно говоря не ожидал такого от С++.
И куда смотрит комитет? Это источник же ошибок не?
Re[5]: Забавно
От: ArtDenis Россия  
Дата: 07.05.22 18:02
Оценка: +1
Здравствуйте, m11, Вы писали:

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


Если включить оптимизацию, то без volatile не будет читать даже с uint32_t tmp =

m11>И куда смотрит комитет? Это источник же ошибок не?


А смысл, если это сломает обратную совместимость? Тем более что уже есть языки, в которых этот источник ошибок исключён.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[4]: Забавно
От: ArtDenis Россия  
Дата: 07.05.22 18:05
Оценка:
Здравствуйте, m11, Вы писали:

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


Потому что согласно стандарту языка, выход из функции main аналогичен возврату нулевого значения.
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: Забавно
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.05.22 18:53
Оценка:
Здравствуйте, m11, Вы писали:

m11>value; это разве оператор? Еще с древних паскальских времен тут вроде должна быть ошибка типа "необходим оператор" а с++ оно вон какое.


Да. В Си выражение является оператором. Вызов функции — это выражение, присваивание — это выражение (у него даже значение есть). А отдельного оператора присваивания в Си нет.

Предупреждения ты заслуживаешь за то, что твое выражение ничего вообще не делает. Но ошибкой это не является.
Re[5]: Забавно
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.05.22 18:55
Оценка: :)
Здравствуйте, m11, Вы писали:

m11>Ну вроде как родственые языки. чесно говоря не ожидал такого от С++.


Что в них родственного-то?

m11>И куда смотрит комитет? Это источник же ошибок не?


C++ — сам источник ошибок. Комитет смотрит, чтобы такого еще в него включить заковыристого перед выходом на пенсию.
Re[4]: Забавно
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.05.22 18:58
Оценка:
Здравствуйте, Андрей Тарасевич, Вы писали:

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


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


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

И да, действительно, в си нет оператора присваивания, зато есть оператор — выражение.
Re[5]: Забавно
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.05.22 19:00
Оценка:
Здравствуйте, Muxa, Вы писали:

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

M>
M>int main;
M>


И что, такое до сих пор компилируется?
Re[5]: Забавно
От: m11  
Дата: 07.05.22 19:14
Оценка:
Здравствуйте, ArtDenis, Вы писали:

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


AD>Потому что согласно стандарту языка, выход из функции main аналогичен возврату нулевого значения.


А почему только из main? Где логика %\
Это до чего довели язык из других функций нельзя а из main можна ;|
Re[3]: Забавно
От: graniar  
Дата: 08.05.22 00:48
Оценка: :)))
Здравствуйте, m11, Вы писали:


m11>>>Почему это компилится?

m11>>>без ошибок.

AD>>А в каком месте должна быть ошибка?


m11>value; это разве оператор? Еще с древних паскальских времен тут вроде должна быть ошибка типа "необходим оператор" а с++ оно вон какое.


По-хорошему должны быть ошибки типа:

"Ваш код не делает ничего полезного"
"Ваш код дублирует функциональность доступных публичных библиотек"
"Вы никчемный программист, найдите себе другое занятие"
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.