Здравствуйте, rg45, Вы писали:
R>А закладывать в язык тормознутые памперсы, только ради того, чтоб можно было переменные не инициализировать — такое правильные пацаны не оценят.
В каком месте оно тормознутое? Вернуть 1 или 0 по производительности одно и тоже.
Правильные пацаны правильные, потому что правильные пацаны считают их правильными? Математические правила строги и не предвзяты, в отличии от "правильных" пацанов.
Здравствуйте, rg45, Вы писали:
R>Разница в производительности не в возвращаемом значении, а в том, нужно ли расставлять памперсы и развешивать слюнявчики.
Не понятно, раставлять растяжки, капканы, раскидывать саморезы и битое стекло и раскладывать грабли, а не памперсы и слюнявчики. Где тут разница в производительности?
Здравствуйте, kov_serg, Вы писали:
_>Не понятно, раставлять растяжки, капканы, раскидывать саморезы и битое стекло и раскладывать грабли, а не памперсы и слюнявчики. Где тут разница в производительности? _>
сгенерировать исключение или завершить программу, это что, бесплатно по-твоему? Или что ты предлагаешь, сделать вид, что все нормально и вычислить выражение с неинициализированной переменной?
--
Не можешь достичь желаемого — пожелай достигнутого.
сгенерировать исключение или завершить программу, это что, бесплатно по-твоему? Или что ты предлагаешь, сделать вид, что все нормально и вычислить выражение с неинициализированной переменной?
Я бы предложил ошибку компиляции, логично и бесплатно.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, 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 можно взять произвольное значение для каждого из преобразований. Следовательно результат выполнения может быть произвольным. Поэтому оптимизатор может оптимизировать код до произвольного значения.
Здравствуйте, 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>Так понятно?
Нет. Без сферы Блоха объяснение не выдерживает никакой критики.
Здравствуйте, kov_serg, Вы писали:
BFE>>Рассмотрим функцию: BFE>>
BFE>>int fn() { int x; return x || !x; }
BFE>>
BFE>>Так понятно? _>Нет. Без сферы Блоха объяснение не выдерживает никакой критики.
А! Я понял ваши затруднения: вы ошибочно полагаете, что в выражении x || !x;x слева и x справа обязаны иметь одно и тоже значение. Так?
Здравствуйте, 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
Здравствуйте, 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" должно быть иначе?
Здравствуйте, 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");
}
<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" должно быть иначе?
— Але, мама, дай папе трубку.
— Але, папа, Спартак чемпион??? ?
— Да, да, да, конечно, дочка, конечно!!! !
— Пап, дай маму.
— Але, мам, ты слышала, папа разрешил.
А почему вы считаете что данное равенство не должно выполняться?
Здравствуйте, B0FEE664, Вы писали:
_>>Нет я полагаю что компилятор оперирует элементом не принадлежащим множеству значений int. BFE>Разумеется. Компилятор работает с текстом.
Он не с текстом работает когда проводит преобразования над DAG-ом. _>>И советую обходить такие компиляторы стороной. BFE>Почему?
Потому что я против наркотиков https://godbolt.org/z/eMeY777T3
Здравствуйте, kov_serg, Вы писали:
BFE>>Если ответ "да", то почему вы предполагаете, что в выражении "x==x" должно быть иначе? _>А почему вы считаете что данное равенство не должно выполняться?
Потому что никто не обещает, что выражение х вообще должно во что-то вычислиться, а не отформатировать винчестер, например. Но даже если по счастливой случайности оно и вычислится, никто не обещает, что при каждом вычислении значения будут одинаковыми. Твои ожидания относительно значений неинициализированных переменных ни на чем не основаны.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, rg45, Вы писали:
R>Потому что никто не обещает, что выражение х вообще должно во что-то вычислиться, а не отформатировать винчестер, например. Но даже если по счастливой случайности оно и вычислится, никто не обещает, что при каждом вычислении значения будут одинаковыми.
В каких ещё языках кроме C/C++ есть подобные практики?