Автор: Sergey Teplyakov

Многие знают о сокращенном вычислении булевых выражений, которые существуют в C, С++, C#, Java и других языках программирования. Имеется ввиду такая ситуация: 1. if ( firstCondition || secondCondition) 2. If (firstCondition && secondCondition ) В первом случае, если вычисление первого выражения даст true, то второе выражение не будет вычислено вообще. Во втором случае ситация аналогична: если вычисление первого выражение дает false, то результатом всего выражения в любом случае будет false, поэтому второе выражение вычислять не обязательно. Таким образом данные операторы не являются коммутатитвными, поскольку результат выражения A && B может быть определен, в то время, как результат выражения B && A, может быть неопределенным. Простой пример отсутствия коммутативности следующий: 1. if ( i != 0 && k/i > 10 ) 2. if ( k/i > 10 && i != 0 ) Эти два выражения не являются эквивалентными, т.к. во втором случае возможно деление на 0. Данное поведение противоречит теории, с той точки зрения, что стандартные математические булевы операторы являются комутативными. Т.е. а and b всегда имеет тоже значение, что и b and a, в то время как a && b не всегда имеет тоже значение, что и b && a. Но, вероятно, не многие знают, что во всех этих языках можно несколько 'обойти' поведение по умолчанию и добиться коммутативности выполнения булевых операций. Для этого необходимо воспользоваться битовыми операциями. 1. if ( firstCondition & secondCondition ) 2. if ( firstCondition | secondCondition ) В этом случае все условные выражения будут вычисляться всегда, тем самым получая коммутативность булевых операторов. 'Белой вороной' (как и во многих других вопросах) выглядит язык программирования Eiffel. В этом языке программирования основные булевы операторы and и or являются 'строгими' (коммутативными). Их поведение совпадает с поведением битовых операторов | и &. При этом есть дополнительные булевы операторы and then и or else, которые ведут себя аналогично булевым операторам языков семейства С.
Помогла статья? Оцените её!
0 из 5. Общее количество голосов - 0
 

You have no rights to post comments

Дмитрий Крикунов

Публикую статьи, обучающие курсы и новости по программированию: алгоритмам, языкам (С++, Java), параллельному программированию, паттернам и библиотекам (Qt, boost).