2014 dxdy logo

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

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




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

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

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

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

Спасибо!

 
 
 
 Re: C# порядок логичeских операций
Сообщение15.07.2011, 23:31 
Отсюда 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 
Bridgeport в сообщении #468789 писал(а):
Добрый день!

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

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

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

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

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

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

 
 
 
 Re: C# порядок логичeских операций
Сообщение16.07.2011, 20:06 
Кстати, а зачем тогда вообще нужен оператор &, вроде как && много эффективнее!?

 
 
 
 Re: C# порядок логичeских операций
Сообщение17.07.2011, 06:18 
А с помощью && побитовые операции выполнять (разве) можно?

 
 
 
 Re: C# порядок логичeских операций
Сообщение17.07.2011, 16:15 
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 
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 
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 
Осталось лишь заметить, что в 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 
Circiter в сообщении #469439 писал(а):
... операторы | и + действительно похожи, ... Иногда эту взаимозаменяемость операторов можно встретить и в реальном коде (обработка флажков), особенно этим грешат delphi-кодеры. :)
"А гадость пью из экономии...": в Дельфи знак логической суммы аж вдвое длиннее, да еще и обязательно выделяется пробелами. :wink:

 
 
 
 Re: C# порядок логичeских операций
Сообщение19.07.2011, 08:25 
А, точно. "To be, or not to be..."

 
 
 
 Re: C# порядок логичeских операций
Сообщение19.07.2011, 09:08 
Circiter в сообщении #469439 писал(а):
особенно этим грешат delphi-кодеры. :)

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

 
 
 
 Re: C# порядок логичeских операций
Сообщение19.07.2011, 11:08 
2ewert
Да я просто имел ввиду передачу комбинаций флажков --- вместо f(mfFlag1 or mfFlag2) иногда пишут f(mfFlag1+mfFlag2). Экономия в 3 символа, а эффект тот же; да и мнемоничней так -- сразу видно, что флажки все вместе передаются, т.е. складываются. :)

 
 
 
 Re: C# порядок логичeских операций
Сообщение19.07.2011, 11:25 
Circiter в сообщении #469521 писал(а):
Да я просто имел ввиду передачу комбинаций флажков --- вместо f(mfFlag1 or mfFlag2) иногда пишут f(mfFlag1+mfFlag2).

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

 
 
 [ Сообщений: 18 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group