Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 06.06.2013, 12:57   #11
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Не учли, что ^ - поразрядный оператор. false - это 0, true - это что угодно кроме 0. Поэтому true^true равно, вообще говоря, чему угодно.
Ваши слова заставили меня засомневаться, но сейчас опробовал все три варианта развития событий на компе (тогда это было просто в голове без использования компа) все корректно работает. Мне кажется причина в том что после использования отрицания !i оно возвращает булевское значение, а не инверсию этого числа. Может это зависит от компилятора?! Мне сложно сейчас ответит на этот вопрос. да и вполне возможно что на другом языке программирования эта конструкция не сработает
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 06.06.2013, 13:07   #12
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Мне кажется причина в том что после использования отрицания !i оно возвращает булевское значение, а не инверсию этого числа. Может это зависит от компилятора?!
Если не оговорено стандартом, то разумеется зависит от компилятора. И на уровне процессора нет понятия "булево значение", это всегда какой-то регистр.
Понятно, что !0 ^ !0 "почти наверняка" будет приведено к a^a, что равно 0 ("ложь"). Но это не то рассуждение, на которое стоит опираться без необходимости.
Abstraction вне форума Ответить с цитированием
Старый 06.06.2013, 14:32   #13
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Если не оговорено стандартом, то разумеется зависит от компилятора. И на уровне процессора нет понятия "булево значение", это всегда какой-то регистр.
Понятно, что !0 ^ !0 "почти наверняка" будет приведено к a^a, что равно 0 ("ложь"). Но это не то рассуждение, на которое стоит опираться без необходимости.
Наверное тема затянулась, но все же вот что я скажу. После поверки этой конструкции через дизассемблер стало понятно что оно делает как и почему. Там присутствует в коде команда "setz cl" (регистр не важно какой. Так эта команда и ей подобные проверяют флаг установлен или нет. Если он установлен то присваивает регистру 01h если нет то 00h по этому работа идет не с числом как таковым а все таки с "булевским" значением или по другому флагом.
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 06.06.2013, 14:42   #14
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
После поверки этой конструкции через дизассемблер стало понятно что оно делает как и почему. Там присутствует в коде команда "setz cl" (регистр не важно какой. Так эта команда и ей подобные проверяют флаг установлен или нет. Если он установлен то присваивает регистру 01h если нет то 00h по этому работа идет не с числом как таковым а все таки с "булевским" значением или по другому флагом.
Различайте поведение, определяемое стандартом и поведение, определяемое частным компилятором при частных настройках и компиляции под частную платформу. Первое зафиксировано в бумаге и (в норме) соблюдается всеми. Второе работает в частном случае и гарантий относительно того, не перестанет ли это работать в самый неподходящий момент, Вам никто не даёт.
Abstraction вне форума Ответить с цитированием
Старый 06.06.2013, 15:02   #15
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Различайте поведение, определяемое стандартом и поведение, определяемое частным компилятором при частных настройках и компиляции под частную платформу. Первое зафиксировано в бумаге и (в норме) соблюдается всеми. Второе работает в частном случае и гарантий относительно того, не перестанет ли это работать в самый неподходящий момент, Вам никто не даёт.
Кстати вернувшись к основам c и c++ откопал интересную вещь. Дело в том что выражение if (!vallue) эквивалентно выражению if (vallue == 0) соответственно мою реализацию можно переписать следующим образом и логически ничего не изменится. while ((buffer[--i] == 0) ^ (i == 0)). из этого делаю вывод что это ни в коем разе не противоречит стандарту. Соответственно и не зависит от компилятора.
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 06.06.2013, 15:18   #16
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
из этого делаю вывод что это ни в коем разе не противоречит стандарту. Соответственно и не зависит от компилятора.
Найдите в стандарте утверждение о том, что (выражение, значение которого есть "истина")^(выражение, значение которого есть "истина") == false и я с Вами соглашусь.
Контрпример:
Код:
int a=3, b=5;
if(!a) std::cerr << "a";
if(!b) std::cerr << "b";
if(a^b) std::cerr << "a^b";
Abstraction вне форума Ответить с цитированием
Старый 06.06.2013, 15:22   #17
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Найдите в стандарте утверждение о том, что (выражение, значение которого есть "истина")^(выражение, значение которого есть "истина") == false и я с Вами соглашусь.
Контрпример:
Код:
int a=3, b=5;
if(!a) std::cerr << "a";
if(!b) std::cerr << "b";
if(a^b) std::cerr << "a^b";
Это называется исключающее или его таблица стесненности следующая:
x y отв
0 0 0
0 1 1
1 0 1
1 1 0

А приведенный вами пример не то же самое что (!a ^ !b)
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Старый 06.06.2013, 15:29   #18
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Это называется "исключающее или", его таблица истинности следующая:
Я знаю, что такое "исключающее или", спасибо. Также я знаю, что ^ - это поразрядный оператор (сравните поразрядный оператор & и логический оператор &&, к примеру).
Цитата:
А приведенный вами пример не то же самое что (!a ^ !b)
Да. Этот пример демонстрирует ситуацию, когда a в логическом выражении есть true, b в логическом выражении есть true, а a^b... тоже true.
То есть, из того, что a и b есть true, ещё не следует, что a^b есть false.
Abstraction вне форума Ответить с цитированием
Старый 06.06.2013, 15:42   #19
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Я знаю, что такое "исключающее или", спасибо. Также я знаю, что ^ - это поразрядный оператор (сравните поразрядный оператор & и логический оператор &&, к примеру).
Да. Этот пример демонстрирует ситуацию, когда a в логическом выражении есть true, b в логическом выражении есть true, а a^b... тоже true.
То есть, из того, что a и b есть true, ещё не следует, что a^b есть false.
Но все равно повторюсь. a^b это не то же самое что !a ^ !b. Вы наверное ссылаетесь на сокращение записи if (vallue)!? Если исходить из обратного то оно эквивалентно записи if (vallue != 0). И если говорить о стандарте то в скобках выражения if, так же как и while может находится только булевское выражение. Ни char ни int ни другие какие нибудь типы данных находится там сами по себе не могут, да это и бессмысленно. И все логические операции && || != == ну и так далее возвращают булевский тип. а операция ^ в моей реализации работает уже с возвращенным булевским значением а не с сами числами.
Может это и чушь, но это моя чушь и я ее никому не отдам.
Shad0wF1rst вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не большой вопрос по модулю GRAPH An4ix.Murad Паскаль, Turbo Pascal, PascalABC.NET 1 29.05.2012 21:29
Не большой вопрос ziganurov2011 Паскаль, Turbo Pascal, PascalABC.NET 8 22.07.2011 22:31
Вопрос оптимизации работы с MS Word Mixasik Общие вопросы Delphi 1 15.06.2009 12:13
Вопрос оптимизации программы на С++ argrus Помощь студентам 9 30.03.2008 00:54