2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 C# порядок логичeских операций
Сообщение15.07.2011, 21:41 


17/04/06
256
Добрый день!

Насколько я знаю в C++ в выражении вида
if (A & B)

оценка происходит справа на лево, т.е. если А=False, то B даже и не оценивается.

Верно ли это для C# и можно ли заставить C# вести себа как C++?

Спасибо!

 Профиль  
                  
 
 Re: C# порядок логичeских операций
Сообщение15.07.2011, 23:31 
Заслуженный участник


09/08/09
3438
С.Петербург
Отсюда http://msdn.microsoft.com/en-us/library ... 71%29.aspx:
Цитата:
The && and || operators are called the conditional logical operators. They are also called the "short-circuiting" logical operators.
...
The && and || operators are conditional versions of the & and | operators:
  • The operation x && y corresponds to the operation x & y, except that y is evaluated only if x is true.
  • The operation x || y corresponds to the operation x | y, except that y is evaluated only if x is false.

 Профиль  
                  
 
 Re: C# порядок логичeских операций
Сообщение15.07.2011, 23:34 
Заслуженный участник


04/05/09
4587
Bridgeport в сообщении #468789 писал(а):
Добрый день!

Насколько я знаю в C++ в выражении вида
if (A & B)

оценка происходит справа на лево, т.е. если А=False, то B даже и не оценивается.

Верно ли это для C# и можно ли заставить C# вести себа как C++?

Спасибо!
Неверно во всех языках.
То что вам надо - оператор &&, и ведёт он себя одинаково в C, C++, C#, Java, JavaScript, и многих других.
А ещё вы право и лево перепутали...

 Профиль  
                  
 
 Re: C# порядок логичeских операций
Сообщение16.07.2011, 00:56 


17/04/06
256
Большое спасибо!

Действительно перепутал "сено и солома"

 Профиль  
                  
 
 Re: C# порядок логичeских операций
Сообщение16.07.2011, 20:06 


17/04/06
256
Кстати, а зачем тогда вообще нужен оператор &, вроде как && много эффективнее!?

 Профиль  
                  
 
 Re: C# порядок логичeских операций
Сообщение17.07.2011, 06:18 
Заслуженный участник


26/07/09
1559
Алматы
А с помощью && побитовые операции выполнять (разве) можно?

 Профиль  
                  
 
 Re: C# порядок логичeских операций
Сообщение17.07.2011, 16:15 
Заслуженный участник


15/05/05
3445
USA
Bridgeport в сообщении #469005 писал(а):
Кстати, а зачем тогда вообще нужен оператор &, вроде как && много эффективнее!?
1. & - это не логический, а битовый оператор. Его можно использовать в if (A & B) благодаря особенностям С: 0-й результат интерпретируется как false, ненулевой - как true. Так что и if (A + B) допустимо.
2. В операторе if (funA(x) & funB(x)) при вычислении funB(x) возможен side effect, так что вычислять ее необходимо, даже если funA(x) возвращает false. В этом случае использовать if (funA(x) && funB(x)) нельзя.

 Профиль  
                  
 
 Re: C# порядок логичeских операций
Сообщение17.07.2011, 21:22 


17/04/06
256
Yuri Gendelman в сообщении #469130 писал(а):
Bridgeport в сообщении #469005 писал(а):
Кстати, а зачем тогда вообще нужен оператор &, вроде как && много эффективнее!?
1. & - это не логический, а битовый оператор. Его можно использовать в if (A & B) благодаря особенностям С: 0-й результат интерпретируется как false, ненулевой - как true. Так что и if (A + B) допустимо.
2. В операторе if (funA(x) & funB(x)) при вычислении funB(x) возможен side effect, так что вычислять ее необходимо, даже если funA(x) возвращает false. В этом случае использовать if (funA(x) && funB(x)) нельзя.


Небольшое уточнение, из вашего первого утверждения получается что if (A & B) эквивалентны if (A + B)
Верно ли это? т.е. & и + побитово одно и тоже?

Про side effect это несовсем ясно, но думаю, что со временем догадаюсь

 Профиль  
                  
 
 Re: C# порядок логичeских операций
Сообщение18.07.2011, 14:47 
Заслуженный участник


15/05/05
3445
USA
Bridgeport в сообщении #469200 писал(а):
Небольшое уточнение, из вашего первого утверждения получается что if (A & B) эквивалентны if (A + B)
Верно ли это? т.е. & и + побитово одно и тоже?
Нет, это совершенно неверно. Я должен был это сформулировать яснее.
Я имел в виду, что и if (A & B) , и if (A + B) синтаксически допустимы в С, хотя и &, и + - не логические операторы и их результет - не true или false.

Bridgeport в сообщении #469200 писал(а):
Про side effect это несовсем ясно, но думаю, что со временем догадаюсь
funB(x) может не только вычислять значение функции, но и менять значения глобальных переменных. Тогда говорят, что funB(x) имеет side effect.
Например, сравните if ((i>0) && (k++)) и if ((i>0) & (k++)). В первом операторе значение k после выполнения if будет зависеть от значения i. А во втором k всегда будет увеличиваться на 1.

 Профиль  
                  
 
 Re: C# порядок логичeских операций
Сообщение18.07.2011, 22:19 
Заслуженный участник


26/07/09
1559
Алматы
Осталось лишь заметить, что в C# вместо if(A&B) надо писать явно if((A&B)!=0)...

Ну и ещё различия есть... Например к числам логические операторы типа && в C# применять нельзя. А в языке C можно. Иногда странноватые вещи получаются. К примеру, если ненулевое число трактуется как истина, то сишное выражение 4&&3 равно "истине", т.е. единице, но побитовая версия 4&3 дает "ложное" значение, т.е. ноль. В этом смысле у C# было бы преимущество, если бы до него других C-подобных языков не существовало. :)

-- Вт июл 19, 2011 01:43:50 --

2Bridgeport
Цитата:
Верно ли это? т.е. & и + побитово одно и тоже?

Нет. Вы бы ещё могли спросить эквивалентны ли & с * и | с +. :) Кстати, незнаю как с & и *, но операторы | и + действительно похожи, только + складывает числа по-честному, т.е. перенося единицы из переполняющихся разрядов в старшие, а | складывает числа бит за битом, не заботясь о переносе. Иногда эту взаимозаменяемость операторов можно встретить и в реальном коде (обработка флажков), особенно этим грешат delphi-кодеры. :)

 Профиль  
                  
 
 Re: C# порядок логичeских операций
Сообщение19.07.2011, 05:55 
Заслуженный участник


15/05/05
3445
USA
Circiter в сообщении #469439 писал(а):
... операторы | и + действительно похожи, ... Иногда эту взаимозаменяемость операторов можно встретить и в реальном коде (обработка флажков), особенно этим грешат delphi-кодеры. :)
"А гадость пью из экономии...": в Дельфи знак логической суммы аж вдвое длиннее, да еще и обязательно выделяется пробелами. :wink:

 Профиль  
                  
 
 Re: C# порядок логичeских операций
Сообщение19.07.2011, 08:25 
Заслуженный участник


26/07/09
1559
Алматы
А, точно. "To be, or not to be..."

 Профиль  
                  
 
 Re: C# порядок логичeских операций
Сообщение19.07.2011, 09:08 
Заслуженный участник


11/05/08
32166
Circiter в сообщении #469439 писал(а):
особенно этим грешат delphi-кодеры. :)

Дельфи безгрешен: он жёстко различает арифметические и логические типы данных. К арифметическим данным применимы ровно те же логические операции, что и к логическим (и с тем же эффектом, естественно). К логическим же переменным арифметика неприменима. И нельзя смешивать в одном логическом выражении логические и арифметические переменные. (Хотя при желании компилятор можно и обмануть; но для этого придётся проявить желание.)

 Профиль  
                  
 
 Re: C# порядок логичeских операций
Сообщение19.07.2011, 11:08 
Заслуженный участник


26/07/09
1559
Алматы
2ewert
Да я просто имел ввиду передачу комбинаций флажков --- вместо f(mfFlag1 or mfFlag2) иногда пишут f(mfFlag1+mfFlag2). Экономия в 3 символа, а эффект тот же; да и мнемоничней так -- сразу видно, что флажки все вместе передаются, т.е. складываются. :)

 Профиль  
                  
 
 Re: C# порядок логичeских операций
Сообщение19.07.2011, 11:25 
Заслуженный участник


11/05/08
32166
Circiter в сообщении #469521 писал(а):
Да я просто имел ввиду передачу комбинаций флажков --- вместо f(mfFlag1 or mfFlag2) иногда пишут f(mfFlag1+mfFlag2).

Я просто не понимаю смысла этой записи. Что такое mfFlag?... Если это булевские переменные, то их складывать нельзя. Если байтовые, используемые в роли флажков, то -- можно, но смотрится как-то нелепо. Наконец, если это массивы флажков, упакованные в в байты, то складывать можно, но результат выйдет совершенно не тот, что нужен.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group