Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.63.236] |
|
Сообщ.
#1
,
|
|
|
Разъясните, пожалуйста!
1) формула в математике (Х = Х) - это тоже, что формула в программировании (Х == Х)? 2) формула в математике (Х ≠ Х) - это тоже, что формула в программировании (Х != Х)? Спасибо! |
Сообщ.
#2
,
|
|
|
А что тут говорить, в математике классическая запись:
X = 0 может говорить о совершенно разных вещах. 1. Присвоение иксу нуля (пример: X = 0) 2. Сравнение икса с нулём (пример: Y = f(X), при X=0) В программировании, эти операции могут быть записаны разными операторами: Присвоение (наиболее распространённые операторы): Сравнение (наиболее распространённые операторы): Да, где то это одинаковые операторы (VB/QB/DB/DBP/... и т.д.): dim i as integer i = 0 if i = 0 then ' ... endif Где то разные (BD/TP/C/C++/C#/java/... и т.д.): var i : integer; i := 0; if i = 0 then begin // ... end; int i = 0; if(i==0){ //... } Нельзя ответить на ваш вопрос однозначно. Хотя, для языка C++ то что вы описали, похоже на действительность, разве что, надо обговорить что за математический контекст у операции "X = 0". Добавлено Не уверен, но, имхо, в плюсах такая конструкция не несёт смысла: Цитата ch19 @ Х = Х Х == Х Х != Х По простой причине, оптимизатор должен такое вообще вырезать. То есть, любой пример с такой конструкцией не будет выполнять эту инструкцию. Но, это уже придирки. |
Сообщ.
#3
,
|
|
|
Цитата VisualProg @ Нельзя ответить на ваш вопрос однозначно. Хотя, для языка C++ то что вы описали, похоже на действительность, разве что, надо обговорить что за математический контекст у операции "X = 0". Спасибо! Я так понимаю, что если вместо Х подставить ноль, то (0=0) в математике - это тоже, что (0==0) в программировании. Просто потому, что как о (0=0) можно сказать истинно, так и о (0==0), что оно истинно. В программировании явно возвращается истина, в математике же это просто оговаривается (закон тождества - истинен при любых подстановках значений вместо Х) Или что-то ускользает от моего понимания? |
Сообщ.
#4
,
|
|
|
Вы не ответили, какой контекст математической операции. Без него я не смогу ответить какой его аналог в программировании.
|
Сообщ.
#5
,
|
|
|
Цитата VisualProg @ Вы не ответили, какой контекст математической операции. Без него я не смогу ответить какой его аналог в программировании. Я имел ввиду закон тождества: что такая запись X=X всегда верна независимо от значения Х. Просто в программировании это всегда возвращаемое значение true, в математике же это (неявно) оговаривается. По сути, такая запись (Х=Х) нужна, чтобы показать, что она всегда истинна, раз мы не интересуемся конкретными значениями. |
Сообщ.
#6
,
|
|
|
Цитата ch19 @ Просто в программировании это всегда возвращаемое значение true В программировании, инструкция: int x; x = x; Не выполняется. Она убирается на стадии оптимизации. (весь этот код уберётся) Смотреть ASM результат Инструкции: int x = 0; if(x == x) { return 0; } Смотреть ASM результат (в данном случае, компилятор с не полной оптимизацией, но, её можно усилить, и избавиться от int x = 0;) Так же оптимизируются до: int x = 0; return 0; Опять же, инструкции: int x = 0; if(x != x){ return 1; } return 0; Сократиться, и блок условия с телом удалится. Смотреть ASM результат Получаем код: int x = 0; return 0; Компилятор уже знает что эти выражения можно сократить. Никаких true/false не будет высчитываться, потому что заранее можно эту операцию отбросить. Добавлено Более того, кроме явных тождеств: X = X компилятор может поступать ещё более интеллектуально, и вычислять такие тождества: const int VALUE = 3; int x = VALUE; if(x-3 == 0){ return 1; } return 0; В результате, компилятор оптимизирует код до такого: return 1; Сверх этого, оптимизатор может смотреть ещё глубже, и находить самые оптимальные способы расположения/отбрасывания инструкций, ещё менее очевидные. Так что, показанные вами тождества в программировании - это скорее чисто теоретический случай, на практике его отбрасывают компиляторы, чтобы упростить ваш код. |
Сообщ.
#7
,
|
|
|
Цитата VisualProg @ Компилятор уже знает что эти выражения можно сократить. Никаких true/false не будет высчитываться, потому что заранее можно эту операцию отбросить. Отбрасывает потому, что это верно всегда! Так ведь об этом и речь: зачем считать, если всегда получаем истину. Как и для Х≠Х,которая всегда ложна. Допустим, имеется множество. И пусть задача состоит в том, чтобы выяснить: есть в в этом множестве какое-то значение. Эти их свойства (всегда истинно, всегда ложно) можно использовать, сравнивая в цикле каждый элемент множества с тем, что мы ищем. Тогда такая проверка даст ответ: есть или нет он в таком множестве. С точки зрения логики - это проверка на равно элемента с ним же самим! |
Сообщ.
#8
,
|
|
|
Цитата ch19 @ Так ведь об этом и речь: зачем считать, если всегда получаем истину. Как и для Х≠Х,которая всегда ложна. Никто и не считает... вы смотрели ссылки на дизасм что я скинул? Добавлено Цитата ch19 @ С точки зрения логики - это проверка на равно элемента с ним же самим! Конечно нет. Для искомого числа , и для числа внутри множества у вас будут два совершенно разных адреса. |
Сообщ.
#9
,
|
|
|
Цитата VisualProg @ Конечно нет. Для искомого числа , и для числа внутри множества у вас будут два совершенно разных адреса. Я ведь другом. Если мы получили предварительный результат (пусть это будет некое число, например 5). И его же куда-то дальше подставляем, мы же не говорим, что эти пятерки разные,хоть они в разных местах на листочке пишутся. Также и программировании: число пять по адресу х - тоже, что число 5 по адресу y. Речь о числе, а не числе, записанному по определенному адресу. |
Сообщ.
#10
,
|
|
|
Цитата ch19 @ мы же не говорим, что эти пятерки разные Почему? Вполне возможен и такой исход, где две пятёрки совершенно разные. Попробуйте ещё раз сформулировать вопрос, а то я не понимаю что вы хотите узнать) |
Сообщ.
#11
,
|
|
|
Цитата VisualProg @ Попробуйте ещё раз сформулировать вопрос Попробую. 1) В математике (=) это операция, которая при подстановке терма-слева и терма-справа, позволяет говорить об истинности или ложности всего высказывания. 2) В программировании (==) - это операция, которая при подстановке операнда-слева и операнда-справа, позволяет говорить об истинности или ложности всего высказывания. Это одно и тоже. |
Сообщ.
#12
,
|
|
|
Да, именно так и происходит. (Насчёт "подстановки" не ручаюсь говорить, но, происходит сравнение первого операнда со вторым)
Добавлено Цитата Это одно и тоже. Возможно. Более того, программирование использует математический аппарат, логично, что есть одинаковые моменты. |
Сообщ.
#13
,
|
|
|
Цитата VisualProg @ Да, именно так и происходит. (Насчёт "подстановки" не ручаюсь говорить, но, происходит сравнение первого операнда со вторым) Добавлено 4 минуты назад Цитата Это одно и тоже. Возможно. Более того, программирование использует математический аппарат, логично, что есть одинаковые моменты. Спасибо за высказанные соображения! |
Сообщ.
#14
,
|
|
|
Надеюсь, вы понимаете, что всё это корректно только до тех пор пока в качестве X выступают целые числа? (char/int/long), в случае для вещественных чисел могут быть небольшие отличия, а вот для остальных случаев - целый ряд условий и преобразований.
|
Сообщ.
#15
,
|
|
|
Не надо путать математику и программирование.
В математике X = Y - это некое утверждение о значениях величин (или выражений) X и Y, которое в зависимости от контекста может означать совершенно разные вещи. Это может быть условие, которое надо проверить. Или утверждение, что эти две величины равны, и тогда одну из них можно заменить на другую в остальных местах. Или вычислив значение одной из них можно узнать другую. Так что это математическое равенство может в программировании соответствовать и X == Y, и X = Y, и Y = X, и есть ещё другие варианты, которые в программе в одну строчку не описываются. |