Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.07.2010, 01:48   #1
ts-alan
Форумчанин
 
Регистрация: 07.07.2010
Сообщений: 825
Сообщение Опирации булевской логики

Обьесните пожалуста принципиальное отличие операций & и &&(или | и ||).Основное отличие я занаю.Так зачем их две ? И что чаще всего употребляют? И что & и |-это порязрядные операции я тоже вкурсе. Мне нужно их употребление в булевской логике.И что стандарт из них в употреблении в языке мне оч. важно.
ts-alan вне форума Ответить с цитированием
Старый 07.07.2010, 02:05   #2
wyvern
Форумчанин
 
Аватар для wyvern
 
Регистрация: 24.03.2009
Сообщений: 215
По умолчанию

& - логическое "и" (конъюнкция)
| - логическое "или" (дизъюнкция)

Код:
          &         |
0 0     0         0
0 1     0         1
1 0     0         1
1 1     1         1
Это не операции булевой логики, это функции от двух переменных на множестве слов некоторой длины, состоящих из нуля и единицы. Дискретная математика. В булевой логике оно вообще не используется.

&& и || - это операции булевой логики, которые отвечают за "и" и "или" соответственно.

Очень тяжело объяснить разницу, но она принципиальна. Между & и &&, между | и || вообще практически ничего общего нету.

Дам, пожалуй, пример. Допустим, нам нужно узнать, четное число или нечетное. Естественно, если число четное - последним битом будет 0, если нечетное - 1. Конъюнкция нашего числа и единицы даст в принципе либо единицу, либо ноль. Если в итоге будет единица - последний бит 1 и число нечетное, и наоборот.

Код:
// x - наше число, пусть там будет, скажем, пять, выглядит оно так: 101
int x = 5;
if ((x & 1) == 1)
     cout << "Нечетное" << endl;
else
     cout << "Четное" << endl;
wyvern@localhost:~$ sudo emerge --unmerge world

Последний раз редактировалось wyvern; 07.07.2010 в 02:25.
wyvern вне форума Ответить с цитированием
Старый 07.07.2010, 03:07   #3
ts-alan
Форумчанин
 
Регистрация: 07.07.2010
Сообщений: 825
По умолчанию

Спасибо wyvern. Чесно говоря я не знал что четность можно определять так(а я всё через %).Там по моему надо место второй "1" надо x(если ошибаюсь поправте-я не сильный програмист). Я имел ввиду разницу между & и &&.Но ответ я кажется нашел сам. Самое интересное что (если опять же не ошибаюсь) & и | в булевской логике можно использовать.Разница в том ,что если мы используем &&, а не & то
язык не будет использовать оценку правого оператора перед вычисление всего выражения ,так как результат выражения будет определяться только одним левым оператором.Т.е если левый операнд будет false,то правый оцениваться вообще не будет(при &&).Например:
if(demon!=0 && num/demon>10);
Нет риска исключительной операции.
При & проверяются 2 операнда.Например:
if(c==1 & e++>10) d=100;
Эта операция гарантирует что инкремент будет применяться в не зависимости равна ли переменная с==1 или нет.

Если ошибаюсь поправте или напишите кто что знает есчё про это.
ts-alan вне форума Ответить с цитированием
Старый 07.07.2010, 06:19   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от wyvern Посмотреть сообщение
&& и || - это операции булевой логики, которые отвечают за "и" и "или" соответственно.

Очень тяжело объяснить разницу, но она принципиальна. Между & и &&, между | и || вообще практически ничего общего нету.

Код:
// x - наше число, пусть там будет, скажем, пять, выглядит оно так: 101
int x = 5;
if ((x & 1) == 1)
     cout << "Нечетное" << endl;
else
     cout << "Четное" << endl;
Отличие этих операций в том, что & - это поразрядное "и", а && - логическое и выдаёт только значения true и false, а в этом примере она не проявляется. Попробуйте сделать вот так:

int x = 5;
if(x & 2) Label1->Caption = "true"; else Label1->Caption = "false";

В этом случае выведется значение false.

Если сделать вот так:

if(x && 2).....

то true.
Почему так происходит для меня осталось загадкой. Но факт есть факт!

Кстати x = x & 2 (результат 1) и x = x && 2 (результат 0) тоже не эквивалентны, хотя компилятор ошибку не выдаёт
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 07.07.2010 в 06:22.
Smitt&Wesson вне форума Ответить с цитированием
Старый 07.07.2010, 06:29   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

5&2=101&10=0(второе это бинарный вид)
5&&2=true&&true=true(привидение к булевому типу, то что не ноль считается true)

&&-логическое И(конъюнкция/умножение), результат операции это true/false
#define TRUE 1
#define FALSE 0
Код:
        код       |псевдо-код*|результат
TRUE&&TRUE   |TRUE*TRUE  |TRUE
TRUE&&FALSE |TRUE*FALSE |FALSE
FALSE&&TRUE |FALSE*TRUE |FALSE
FALSE&&FALSE|FALSE*FALSE|FALSE
*или действительно такой смысл, не проверял.
теперь замените TRUE/FALSE на значения, и я думаю будет понятно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 07.07.2010 в 06:35.
Пепел Феникса вне форума Ответить с цитированием
Старый 07.07.2010, 07:33   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Спасибо Пепел Феникса. Да я уже и сам разобрался. Просто как то не задумывался над этим вопросом. Как говорьться если язык требует, так и пишем.
Грубо говоря операция & работает над битами в байтах, а && над логическими выражениями в операциях сравнения (во завернул )
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 07.07.2010, 08:35   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Очень тяжело объяснить разницу
Ниче тяжелого.
& - вернет числовое значение а && - булевое, вот и вся разница.
Как таково это важно для компиляторов и программиста, не более.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.07.2010, 11:25   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
вот и вся разница.
&& это по сути простое умножение, возвращает bool.
& же работает бинарно/побитово, вовращает больший из двух типов.
в какой то мере можно сказать что & состоить из серии && для пар битов.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Раздел Алгебры Логики Базиля Помощь студентам 1 23.12.2009 00:13
Примеры по алгебре логики polukrovka Помощь студентам 4 08.12.2009 15:10
Развитие логики Lemo Помощь студентам 5 04.11.2009 14:23
Помогите пожалуйста с Булевской алгеброй. ksu25 Помощь студентам 2 25.09.2009 20:03
Элементы математической логики. Высказывания Vesnushka18 Помощь студентам 1 11.04.2008 17:40