среда, ноября 17, 2010

Оказывается - 5

… что и MSDN не всегда говорит правду.

Например, читаем

An expression using the &= assignment operator, such as

x &= y

is equivalent to

x = x & y 

На практике оказывается, что эквивалентность для логических операндов наблюдается только в приведённом примере:

class AndAssignment
{
static void Main()
{
bool b = true;
b &= false;
Console.WriteLine(b);
}
}
/*
Output:
False
*/

Если же операнд y является вызовом какой-либо процедуры, то оператор &= эту процедуру вызывает всегда, независимо от значения x.

2 комментария:

Роман Итакаев комментирует...

>> Если же операнд y является вызовом какой-либо процедуры, то оператор &= эту процедуру вызывает всегда, независимо от значения x.
А оператор & как то зависит от x? У меня как то не получилось такого эффекта добиться. Объясните :)

bool y()
{
Console.WriteLine(@"I'm in y!");
return true;
}

void t1()
{
bool x = false;
x = x & y();
Console.WriteLine(String.Format(@"x = {0}", x));
}

void t2()
{
bool x = true;
x = x & y();
Console.WriteLine(String.Format(@"x = {0}", x));
}

void t3()
{
bool x = false;
x &= y();
Console.WriteLine(String.Format(@"x = {0}", x));
}

void t4()
{
bool x = true;
x &= y();
Console.WriteLine(String.Format(@"x = {0}", x));
}

void Main()
{
t1();
t2();
t3();
t4();
}

/*
Output:
I'm in y!
x = False
I'm in y!
x = True
I'm in y!
x = False
I'm in y!
x = True
*/

DkmS комментирует...

Вот мой тест:
private static bool tr() {
Console.WriteLine("set true");
return true;
}
private static bool fa() {
Console.WriteLine("set false");
return false;
}
internal static void TestAnd() {
Console.WriteLine("&& :");
bool qq = fa();
qq = qq && tr();
Console.WriteLine("Result={0}", qq);
Console.WriteLine("&= :");
qq = fa();
qq &= tr();
Console.WriteLine("Result={0}", qq);
}
/*
&& :
set false
Result=False
&= :
set false
set true
Result=False
*/

В первом случае вторая функция не вызывается, что и правильно.