Re[8]: Что должна вернуть функция?
От: kov_serg Россия  
Дата: 29.07.21 15:42
Оценка:
Здравствуйте, rg45, Вы писали:

R>А закладывать в язык тормознутые памперсы, только ради того, чтоб можно было переменные не инициализировать — такое правильные пацаны не оценят.

В каком месте оно тормознутое? Вернуть 1 или 0 по производительности одно и тоже.
Правильные пацаны правильные, потому что правильные пацаны считают их правильными? Математические правила строги и не предвзяты, в отличии от "правильных" пацанов.
Re[9]: Что должна вернуть функция?
От: rg45 СССР  
Дата: 29.07.21 16:02
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>В каком месте оно тормознутое? Вернуть 1 или 0 по производительности одно и тоже.


Разница в производительности не в возвращаемом значении, а в том, нужно ли расставлять памперсы и развешивать слюнявчики.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[10]: Что должна вернуть функция?
От: kov_serg Россия  
Дата: 29.07.21 17:52
Оценка:
Здравствуйте, rg45, Вы писали:

R>Разница в производительности не в возвращаемом значении, а в том, нужно ли расставлять памперсы и развешивать слюнявчики.

Не понятно, раставлять растяжки, капканы, раскидывать саморезы и битое стекло и раскладывать грабли, а не памперсы и слюнявчики. Где тут разница в производительности?
template<class T>
bool fn() { T t; return t==t; }
Re[11]: Что должна вернуть функция?
От: rg45 СССР  
Дата: 29.07.21 18:00
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Не понятно, раставлять растяжки, капканы, раскидывать саморезы и битое стекло и раскладывать грабли, а не памперсы и слюнявчики. Где тут разница в производительности?

_>
_>template<class T>
_>bool fn() { T t; return t==t; }
_>


Как это "где"? Ты же предлагаешь
Автор: kov_serg
Дата: 25.07.21
сгенерировать исключение или завершить программу, это что, бесплатно по-твоему? Или что ты предлагаешь, сделать вид, что все нормально и вычислить выражение с неинициализированной переменной?
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[12]: Что должна вернуть функция?
От: · Великобритания  
Дата: 29.07.21 18:09
Оценка: +1
Здравствуйте, rg45, Вы писали:

_>>bool fn() { T t; return t==t; }


R>Как это "где"? Ты же предлагаешь
Автор: kov_serg
Дата: 25.07.21
сгенерировать исключение или завершить программу, это что, бесплатно по-твоему? Или что ты предлагаешь, сделать вид, что все нормально и вычислить выражение с неинициализированной переменной?

Я бы предложил ошибку компиляции, логично и бесплатно.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[13]: Что должна вернуть функция?
От: rg45 СССР  
Дата: 29.07.21 18:17
Оценка:
Здравствуйте, ·, Вы писали:

·>Я бы предложил ошибку компиляции, логично и бесплатно.


Ну вот с этим бы я согласился.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[13]: Что должна вернуть функция?
От: rg45 СССР  
Дата: 29.07.21 18:23
Оценка: +1 :))
Здравствуйте, ·, Вы писали:

·>Я бы предложил ошибку компиляции, логично и бесплатно.


Кстати, забавно видеть здесь вот такое предупреждение:

warning: self-comparison always evaluates to true


В то время как функция возвращает false
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[14]: Что должна вернуть функция?
От: kov_serg Россия  
Дата: 29.07.21 19:10
Оценка:
Здравствуйте, rg45, Вы писали:

R>·>Я бы предложил ошибку компиляции, логично и бесплатно.


R>Кстати, забавно видеть здесь вот такое предупреждение:


R>

R>warning: self-comparison always evaluates to true


R>В то время как функция возвращает false

Ну вот видите как удивителен мир. А это всего лишь тривиальный однострочный пример.
Re[15]: Что должна вернуть функция?
От: rg45 СССР  
Дата: 29.07.21 20:12
Оценка: :)))
Здравствуйте, kov_serg, Вы писали:

_>Ну вот видите как удивителен мир. А это всего лишь тривиальный однострочный пример.


Это экстремальный случай UB, когда даже компилятор не знает, что будет делать сгенерированный им код
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 30.07.2021 7:57 rg45 . Предыдущая версия .
Re[3]: Что должна вернуть функция?
От: B0FEE664  
Дата: 30.07.21 08:06
Оценка: +2 -1
Здравствуйте, kov_serg, Вы писали:

R>>P.S. Тебе уже сто раз все объяснили, но ты продолжаешь упрямствовать. А на чем, собственно, основана твоя уверенность, что правила математики применимы к x?

_>Чем плохи правила математики? Они не противоречивые. Но тут полная фигня. ...
_>Мне не понятно одно: упрямство окружающих с пеной у рта защищающих подобное поведение. ...

Не стоит забывать, что выполнение программы на С++ должно следовать правилам абстрактной машины не привязанной ни к какой архитектуре процессора.
Рассмотрим функцию:
int fn() { int x; return x || !x; }


вычисление преобразований 'x в bool' и '!x -> bool' можно выполнить параллельно на двух разных процессорах взяв в качестве значения x произвольное значение для каждого из преобразований. (Это можно сделать, так как преобразование '!x -> bool' не содержит сторонних эффектов.) Если потребовать выполнения правил математики, то для каждого из преобразований произвольное значение x взять нельзя. Тем самым выполнение правил математики потребует дополнительных операций: согласованных инициализаций x произвольным (но одинаковым для параллельно выполняемых операций) значением, а это противоречие принципу языка "не платить за то, что не используется". Поэтому для выполнения преобразований 'x в bool' и для преобразования '!x -> bool' в качестве значения x можно взять произвольное значение для каждого из преобразований. Следовательно результат выполнения может быть произвольным. Поэтому оптимизатор может оптимизировать код до произвольного значения.

Так понятно?
И каждый день — без права на ошибку...
Re[4]: Что должна вернуть функция?
От: kov_serg Россия  
Дата: 30.07.21 13:16
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Не стоит забывать, что выполнение программы на С++ должно следовать правилам абстрактной машины не привязанной ни к какой архитектуре процессора.

BFE>Рассмотрим функцию:
BFE>
BFE>int fn() { int x; return x || !x; }
BFE>


BFE>вычисление преобразований 'x в bool' и '!x -> bool' можно выполнить параллельно на двух разных процессорах взяв в качестве значения x произвольное значение для каждого из преобразований. (Это можно сделать, так как преобразование '!x -> bool' не содержит сторонних эффектов.) Если потребовать выполнения правил математики, то для каждого из преобразований произвольное значение x взять нельзя. Тем самым выполнение правил математики потребует дополнительных операций: согласованных инициализаций x произвольным (но одинаковым для параллельно выполняемых операций) значением, а это противоречие принципу языка "не платить за то, что не используется". Поэтому для выполнения преобразований 'x в bool' и для преобразования '!x -> bool' в качестве значения x можно взять произвольное значение для каждого из преобразований. Следовательно результат выполнения может быть произвольным. Поэтому оптимизатор может оптимизировать код до произвольного значения.


BFE>Так понятно?

Нет. Без сферы Блоха объяснение не выдерживает никакой критики.
Re[5]: Что должна вернуть функция?
От: B0FEE664  
Дата: 30.07.21 14:40
Оценка:
Здравствуйте, kov_serg, Вы писали:

BFE>>Рассмотрим функцию:

BFE>>
BFE>>int fn() { int x; return x || !x; }
BFE>>


BFE>>Так понятно?

_>Нет. Без сферы Блоха объяснение не выдерживает никакой критики.
А! Я понял ваши затруднения: вы ошибочно полагаете, что в выражении x || !x; x слева и x справа обязаны иметь одно и тоже значение. Так?
И каждый день — без права на ошибку...
Re[6]: Что должна вернуть функция?
От: kov_serg Россия  
Дата: 30.07.21 15:28
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>>>Так понятно?

_>>Нет. Без сферы Блоха объяснение не выдерживает никакой критики.
BFE>А! Я понял ваши затруднения: вы ошибочно полагаете, что в выражении x || !x; x слева и x справа обязаны иметь одно и тоже значение. Так?
Нет я полагаю что компилятор оперирует элементом не принадлежащим множеству значений int. И советую обходить такие компиляторы стороной.
Как говорит народная мудрость: ложка говна на бочку мёда даёт бочку говна.

Предлагаю объяснить более простой случай: https://godbolt.org/z/4hvzrYq8b можно с обрядами, танцами, злыми духами и туннельными эффектами.
#include <stdio.h>

bool fn() { int x; return x==x; }

int main() {
    if (fn()) printf("always true\n");
    else printf("not true\n");
}


ASM generation compiler returned: 0
<source>:3:28: warning: self-comparison always evaluates to true [-Wtautological-compare]
bool fn() { int x; return x==x; }
                           ^
1 warning generated.
Execution build compiler returned: 0
Program returned: 0
not true
Re[7]: Что должна вернуть функция?
От: rg45 СССР  
Дата: 30.07.21 16:21
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Нет я полагаю что компилятор оперирует элементом не принадлежащим множеству значений int.


Так и есть. А почему компилятор должен вести себя иначе? Ты ведь никакого значения не задал.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[7]: Что должна вернуть функция?
От: B0FEE664  
Дата: 30.07.21 16:58
Оценка:
Здравствуйте, kov_serg, Вы писали:

BFE>>А! Я понял ваши затруднения: вы ошибочно полагаете, что в выражении x || !x; x слева и x справа обязаны иметь одно и тоже значение. Так?

_>Нет я полагаю что компилятор оперирует элементом не принадлежащим множеству значений int.
Разумеется. Компилятор работает с текстом.
_>И советую обходить такие компиляторы стороной.
Почему?

_>Как говорит народная мудрость: ложка говна на бочку мёда даёт бочку говна.

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

_>Предлагаю объяснить более простой случай: https://godbolt.org/z/4hvzrYq8b можно с обрядами, танцами, злыми духами и туннельными эффектами.

_>[ccode]
_>bool fn() { int x; return x==x; }
_>[/code]

Здесь ровно тоже самое: x слева и x справа не обязаны иметь одно и тоже значение.
Скажите, kov_serg, а вы понимаете, что в выражении:
x = 1 + x
значения x слева и x справа имеют разные значения?
Если ответ "да", то почему вы предполагаете, что в выражении "x==x" должно быть иначе?
И каждый день — без права на ошибку...
Re[8]: Что должна вернуть функция?
От: kov_serg Россия  
Дата: 30.07.21 17:42
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

BFE>Здесь ровно тоже самое: x слева и x справа не обязаны иметь одно и тоже значение.

Если у меня переменная не volatile почему она имеет не одно и тоже значение?

BFE>Скажите, kov_serg, а вы понимаете, что в выражении:

BFE>x = 1 + x
BFE>значения x слева и x справа имеют разные значения?
Тут операция явного изменения значения переменной x. Как это связано с последующим вопросом?
В erlang если переменной присвоили значение, то всё оно не меняется. А тут даже если оно не меняется оно не совпадает само с собой.
#include <stdio.h>

bool fn() { 
    int x;
    const int z=x;
    return z==z;
}

int main() {
    if (fn()) printf("always true\n");
    else printf("not true\n");
}

https://godbolt.org/z/odn8cWa6T
<source>:6:13: warning: self-comparison always evaluates to true [-Wtautological-compare]
    return z==z;
            ^
1 warning generated.
Execution build compiler returned: 0
Program returned: 0
not true

Так же возвращает false

BFE>Если ответ "да", то почему вы предполагаете, что в выражении "x==x" должно быть иначе?

— Але, мама, дай папе трубку.
— Але, папа, Спартак чемпион??? ?
— Да, да, да, конечно, дочка, конечно!!! !
— Пап, дай маму.
— Але, мам, ты слышала, папа разрешил.

А почему вы считаете что данное равенство не должно выполняться?
Re[8]: Что должна вернуть функция?
От: kov_serg Россия  
Дата: 30.07.21 18:39
Оценка: :)))
Здравствуйте, B0FEE664, Вы писали:

_>>Нет я полагаю что компилятор оперирует элементом не принадлежащим множеству значений int.

BFE>Разумеется. Компилятор работает с текстом.
Он не с текстом работает когда проводит преобразования над DAG-ом.
_>>И советую обходить такие компиляторы стороной.
BFE>Почему?
Потому что я против наркотиков https://godbolt.org/z/eMeY777T3
Re[9]: Что должна вернуть функция?
От: rg45 СССР  
Дата: 30.07.21 19:41
Оценка:
Здравствуйте, kov_serg, Вы писали:

BFE>>Если ответ "да", то почему вы предполагаете, что в выражении "x==x" должно быть иначе?

_>А почему вы считаете что данное равенство не должно выполняться?

Потому что никто не обещает, что выражение х вообще должно во что-то вычислиться, а не отформатировать винчестер, например. Но даже если по счастливой случайности оно и вычислится, никто не обещает, что при каждом вычислении значения будут одинаковыми. Твои ожидания относительно значений неинициализированных переменных ни на чем не основаны.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 30.07.2021 19:44 rg45 . Предыдущая версия . Еще …
Отредактировано 30.07.2021 19:43 rg45 . Предыдущая версия .
Re[10]: Что должна вернуть функция?
От: kov_serg Россия  
Дата: 30.07.21 20:15
Оценка:
Здравствуйте, rg45, Вы писали:

R>Потому что никто не обещает, что выражение х вообще должно во что-то вычислиться, а не отформатировать винчестер, например. Но даже если по счастливой случайности оно и вычислится, никто не обещает, что при каждом вычислении значения будут одинаковыми.

В каких ещё языках кроме C/C++ есть подобные практики?
Re[11]: Что должна вернуть функция?
От: rg45 СССР  
Дата: 30.07.21 20:22
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>В каких ещё языках кроме C/C++ есть подобные практики?


У каждого языка есть свои слабые и сильные стороны и если уж сравнивать, то по совокупности. Иначе это просто беспредметный разговор.
--
Не можешь достичь желаемого — пожелай достигнутого.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.